http://acm.hdu.edu.cn/showproblem.php?pid=1757
矩阵快速幂
/* If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); |f(10) | |a0 a1 a2 ...a8 a9| |f(9)| | f(9) | | 1 0 0 ... 0 0| |f(8)| | .....| = |.. ... ... ... ..| | .. | | f(2) | | 0 0 0 ... 0 0| |f(1)| | f(1) | | 0 0 0 ... 1 0| |f(0)| 另A举证为10*10的举证,如上图。 可以推出: (f(n),f(n-1),...,f(n-9))^(-1) = A^(n-9)*(f(9),f(8),...,f(0))^(-1) */ #include<iostream> using namespace std; __int64 k,m; struct mat { int mar[10][10]; }a,b,tmp; mat matrixmul(mat a,mat b) { int i,j,k; for(i = 0;i < 10;i++) for(j = 0;j < 10;j++) { tmp.mar[i][j] = 0; for(k = 0;k < 10;k++) tmp.mar[i][j] += (a.mar[i][k] * b.mar[k][j]) % m; tmp.mar[i][j] %= m; } return tmp; } void matrix_binary() { while(k) { if(k & 1) b = matrixmul(b,a); a = matrixmul(a,a); k = k >> 1; } } int main() { int i; while (scanf("%I64d%I64d",&k,&m) != EOF) { memset(a.mar,0,sizeof(a.mar)); for(i = 1;i < 10;i++) a.mar[i][i-1] = 1; memset(b.mar,0,sizeof(b.mar)); for(i = 0;i < 10;i++) b.mar[i][i] = 1; for(i = 0;i < 10;i++) scanf("%d",&a.mar[0][i]); if(k < 10) { printf("%d\n", k % m); continue; } k -= 9; matrix_binary(); int res = 0; for(i = 0;i < 10;i++) res += (b.mar[0][i] * (9-i)) % m; printf("%d\n",res%m); } return 0; }