题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757
在吴神的帮助下才明白如何构造矩阵,还是好弱啊。
此处盗一张图
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 7 using namespace std; 8 9 typedef long long ll; 10 11 const int N = 10; 12 13 ll k,m; 14 int a[10]; 15 16 struct matrix 17 { 18 ll mat[N][N]; 19 }; 20 matrix base; 21 void initial() 22 { 23 memset(base.mat,0,sizeof(base.mat)); 24 for(int i=0; i<N; i++) 25 base.mat[0][i]=a[i]; 26 for(int i=1; i<N; i++) 27 for(int j=0; j<N; j++) 28 if(i==j+1) 29 base.mat[i][j]=1; 30 } 31 matrix multi(matrix a,matrix b) 32 { 33 matrix tmp; 34 memset(tmp.mat,0,sizeof(tmp.mat)); 35 for(int i=0; i<N; i++) 36 for(int j=0; j<N; j++) 37 { 38 for(int k=0; k<N; k++) 39 tmp.mat[i][j]=tmp.mat[i][j]+a.mat[i][k]*b.mat[k][j]%m; 40 tmp.mat[i][j]%=m; 41 } 42 return tmp; 43 } 44 45 ll cal(ll n) 46 { 47 matrix ans; 48 memset(ans.mat,0,sizeof(ans.mat)); 49 for(int i=0; i<N; i++) 50 for(int j=0; j<N; j++) 51 if(i==j) 52 ans.mat[i][j]=1; 53 while(n) 54 { 55 if(n&1) 56 ans=multi(base,ans); 57 base=multi(base,base); 58 n>>=1; 59 } 60 61 ll sum=0; 62 for(int i=0; i<N; i++) 63 sum+=ans.mat[0][i]*(N-i-1)%m; 64 return sum%m; 65 } 66 int main() 67 { 68 while(~scanf("%lld%lld",&k,&m)) 69 { 70 for(int i=0; i<N; i++) 71 scanf("%d",&a[i]); 72 if(k<10) 73 printf("%lld\n",k%m); 74 else 75 { 76 initial(); 77 printf("%lld\n",cal(k-9)); 78 } 79 } 80 return 0; 81 }