题意:给出a0~a9和k、m, f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 求f(k)%m。
思路:
矩阵A 矩阵B
0 1 0 0 0 0 0 0 0 0 f0 f1
0 0 1 0 0 0 0 0 0 0 f1 f2
0 0 0 1 0 0 0 0 0 0 f2 f3
0 0 0 0 1 0 0 0 0 0 * f3 ----------> f4
0 0 0 0 0 1 0 0 0 0 f4 f5
0 0 0 0 0 0 1 0 0 0 f5 f6
0 0 0 0 0 0 0 1 0 0 f6 f7
0 0 0 0 0 0 0 0 1 0 f7 f8
0 0 0 0 0 0 0 0 0 1 f8 f9
a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 f9 f10
我们看到规律了,每次要到下次个A*B,以此类推则由A*A*A.......A*B;
矩阵建好了,题就好做了。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757
1 #include <cstdio>
2 #include <cstring>
3 #include <cmath>
4 #include <string>
5 #include <algorithm>
6 #include <iostream>
7 using namespace std;
8 const int N=11;
9
10 typedef struct In{
11 int m[N][N];
12 }Matrix;
13 Matrix init,unit;
14 int k,m;
15 int a[N];
16
17 void Init(){
18 for(int i=1;i<N;i++){
19 for(int j=1;j<N;j++){
20 if(i==j-1) init.m[i][j]=1;
21 else init.m[i][j]=0;
22 unit.m[i][j]=(i==j);
23 }
24 }
25 for(int i=1;i<N;i++)
26 init.m[10][i]=a[N-i];
27 }
28
29 Matrix Mul(Matrix a,Matrix b){
30 Matrix c;
31 for(int i=1;i<N;i++){
32 for(int j=1;j<N;j++){
33 c.m[i][j]=0;
34 for(int k=1;k<N;k++){
35 c.m[i][j]+=a.m[i][k]*b.m[k][j];
36 c.m[i][j]%=m;
37 }
38 }
39 }
40 return c;
41 }
42
43 Matrix Pow(Matrix a,Matrix b){
44 while(k){
45 if(k&1) b=Mul(a,b);
46 a=Mul(a,a);
47 k>>=1;
48 }
49 return b;
50 }
51
52 int main(){
53
54 // freopen("data.in","r",stdin);
55 // freopen("data.out","w",stdout);
56
57 while(scanf("%d%d",&k,&m)!=EOF){
58 for(int i=1;i<N;i++) scanf("%d",&a[i]);
59 if(k<10){
60 printf("%d\n",k%m);
61 continue;
62 }
63 k-=9;
64 Init();
65 Matrix x=Pow(init,unit);
66 int sum=0;
67 for(int i=1;i<N;i++) sum=(sum+x.m[10][i]*(i-1))%m;
68 printf("%d\n",sum);
69 }
70 return 0;
71 }
img id=