一次ac
在做递推关系的题目的时候 快速幂矩阵真的很有用

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,k; struct matrix{ int arr[10][10]; }; matrix multi( matrix a, matrix b ) { matrix c; for(int i=0;i<10;i++) for(int j=0;j<10;j++){ c.arr[i][j]=0; for(int w=0;w<10;w++) c.arr[i][j]=(c.arr[i][j]+a.arr[i][w]*b.arr[w][j]%k)%k; } return c; } int fast(matrix a,int x){ matrix ans; memset(ans.arr,0,sizeof(ans.arr)); for(int i=0;i<10;i++)ans.arr[i][i]=1; while(x){ if(x&1){ ans=multi(ans,a); } x>>=1; a=multi(a,a); } int sum=0; for(int i=0;i<10;i++) { sum+=ans.arr[0][i]*( 9-i ); sum%=k; } return sum; } int main(){ while(scanf("%d%d",&n,&k)==2) { if(n<10){ printf("%d ",n%k); continue; } matrix temp; memset(temp.arr,0,sizeof(temp.arr) ); for(int i=1;i<10;i++) temp.arr[i][i-1]=1; for(int i=0;i<10;i++)scanf("%d",&temp.arr[0][i] ); printf("%d ",fast( temp , n-9 )%k ); } return 0; }