题意 :给你m和k, 让你求f(k)%m。如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… + a9 * f(k-10);
思路 :先具体介绍一下矩阵快速幂吧,刚好刚刚整理了网上的资料。可以先了解一下这个是干嘛的,怎么用。
这个怎么弄出来的我就不说了,直接看链接吧,这实在不是我强项,点这儿,这儿也行
1 //HDU 1757 2 #include <iostream> 3 #include <stdio.h> 4 5 using namespace std; 6 7 struct matrix 8 { 9 int m[10][10] ; 10 } b,tp,res,init ; 11 12 int n,m ; 13 14 matrix Mul(matrix a,matrix b) 15 { 16 matrix c ; 17 for(int i = 0 ; i < 10 ; i++) 18 { 19 for(int j = 0 ; j < 10 ; j++) 20 { 21 c.m[i][j] = 0 ; 22 for(int k = 0 ; k < 10 ; k++) 23 { 24 c.m[i][j] += (a.m[i][k] * b.m[k][j]) % m ; 25 c.m[i][j] %= m ; 26 } 27 } 28 } 29 return c ; 30 } 31 32 matrix matrix_mi(matrix p,int k) 33 { 34 matrix t = res; 35 for(int i = 0 ; i <= 10 ; i++) t.m[i][i] = 1 ; 36 while(k) 37 { 38 if(k & 1) 39 t = Mul(t,p) ; 40 k >>= 1 ; 41 p = Mul(p,p) ; 42 } 43 return t ; 44 } 45 46 void Init() 47 { 48 for(int i = 0 ; i < 10 ; i++) 49 for(int j = 0 ; j < 10 ; j++) 50 if(i-1 == j) 51 init.m[i][j]=1; 52 else 53 init.m[i][j]=0; 54 } 55 int main() 56 { 57 Init() ; 58 while(~scanf("%d %d",&n,&m)) 59 { 60 b = init ; 61 for(int i = 0 ; i < 10 ; i++) 62 scanf("%d",&b.m[0][i]) ; 63 for(int i = 0 ; i < 10 ; i++) 64 for(int j = 0 ; j < 10 ; j++) 65 if(i==j) 66 res.m[i][j] = 1 ; 67 else 68 res.m[i][j] = 0 ; 69 if(n >= 10) 70 { 71 int sum = 0 ; 72 tp = matrix_mi(b,n-9) ; 73 for(int i = 0 ; i < 10 ; i++) 74 sum += (tp.m[0][i] * (9-i))%m ; 75 printf("%d\n",sum%m) ; 76 } 77 else printf("%d\n",n%m) ; 78 } 79 return 0; 80 }