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 }

 

posted @ 2018-02-11 17:52  Changer-qyz  阅读(213)  评论(0编辑  收藏  举报