hdoj1757 A Simple Math Problem(矩阵快速幂)
构造矩阵。
1,当k<=9时,直接输出;
2,当k >9时,先求原矩阵的(k-9)次幂res矩阵,在求幂的过程中对m取余。最后res矩阵再与矩阵F相乘得到矩阵ans,相乘的过程中对m取余。ans矩阵的第一个元素就是答案。
PS.orz,这道题一气呵成。只不过我好像和大家构造矩阵的方向有点点差别。这不重要!能做出题就妥!
1 #include<iostream> 2 #include<cstring> 3 #define maxn 12 4 using namespace std; 5 int f[10]={0,1,2,3,4,5,6,7,8,9}; 6 struct mat{ 7 int a[maxn][maxn]; 8 }; 9 mat mat_mul(mat x,mat y,int Mod){ 10 mat ans; 11 memset(ans.a,0,sizeof(ans.a)); 12 for (int i=0;i<10;i++) 13 for (int j=0;j<10;j++) 14 for (int k=0;k<10;k++){ 15 ans.a[i][j]+=x.a[i][k]*y.a[k][j]; 16 ans.a[i][j]%=Mod; 17 } 18 return ans; 19 } 20 void mat_pow(mat &res,int k,int Mod){ 21 mat c=res; 22 k--; 23 while (k){ 24 if (k&1) res=mat_mul(res,c,Mod); 25 k>>=1; 26 c=mat_mul(c,c,Mod); 27 } 28 } 29 int main(){ 30 mat res; 31 int k,m; 32 while (cin >> k >> m){ 33 memset(res.a,0,sizeof(res.a)); 34 for (int i=0;i<10;i++){ 35 cin >> res.a[i][0]; 36 res.a[i][i+1]=1; 37 } 38 if (k<=9){ 39 cout << f[k]%m << endl; 40 continue; 41 } 42 else mat_pow(res,k-9,m); 43 int ans=0; 44 for (int i=0;i<10;i++){ 45 ans+=res.a[i][0]*f[9-i]%m; 46 } 47 cout << ans%m << endl; 48 } 49 return 0; 50 }