UVA10870矩阵快速幂与递推公式的关系

 1 /*UVA10870:
 2 矩阵快速幂与递推公式的关系:关键就是这句话,以后做题能联想到即可
 3 f(n)=a1f(n-1)+...adf(n-d)
 4 */
 5 #include<iostream>
 6 #include<stdio.h>
 7 #include<string.h>
 8 #include<algorithm>
 9 #include<stdlib.h>
10 #include<math.h>
11 #include<queue>
12 #include<vector>
13 #include<map>
14 #define ULL unsigned long long
15 #define LL long long
16 #define Max_size 17
17 
18 using namespace std;
19 
20 int d,n,MOD;//
21 struct Mat
22 {
23     LL mat[Max_size][Max_size];
24 
25 };
26 Mat operator*(Mat a,Mat b)
27 {
28     Mat c;
29     memset(c.mat,0,sizeof(c.mat));
30     for (int i=0;i<d;i++)
31         for (int j=0;j<d;j++)
32             for (int k=0;k<d;k++)
33                 if (a.mat[i][k] && b.mat[k][j])
34                    c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
35     return c;
36 }
37 Mat operator+(Mat a,Mat b)
38 {
39     Mat c;
40     memset(c.mat,0,sizeof(c.mat));
41     for (int i=0;i<d;i++)
42         for (int j=0;j<d;j++)
43             c.mat[i][j]=(a.mat[i][j]+b.mat[i][j])%MOD;
44     return c;
45 }
46 Mat E;
47 
48 void builtE()
49 {
50     memset(E.mat,0,sizeof(E.mat));
51     for (int i=0;i<Max_size;i++)
52     {
53         E.mat[i][i]=1;
54     }
55 }
56 Mat operator^(Mat A,int x)
57 {
58     Mat c;
59     builtE();
60     c=E;
61     for ( ; x; x>>=1)
62     {
63         if ( x & 1)
64             c = c * A;
65         A = A * A;
66     }
67     return c;
68 }
69 Mat K,F;
70 int main()
71 {
72     while(cin>>d>>n>>MOD)
73     {
74         memset(K.mat,0,sizeof(K.mat));
75         memset(F.mat,0,sizeof(F.mat));
76         for(int i=d-1;i>=0;i--) cin>>K.mat[i][d-1];
77         for(int i=0;i<d;i++) K.mat[i+1][i]=1;
78         K=K^(n-1);
79         for(int i=0;i<d;i++) cin>>F.mat[0][i];
80         F=F*K;
81         cout<<F.mat[0][0]<<endl;
82     }
83     return 0;
84 }
原文地址:https://www.cnblogs.com/little-w/p/3570267.html