http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=459
description |
Lele now is thinking about a simple function f(x).
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);
And ai(0<=i<=9) can only be 0 or 1 .
Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
|
input |
|
output |
|
sample_input |
|
sample_output |
|
#include <stdio.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; typedef long long LL; const int N=10; struct Matrix { LL m[N][N]; }; LL mod; Matrix I= {1,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,1}; Matrix multi(Matrix a,Matrix b) { Matrix c; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { c.m[i][j]=0; for(int k=0;k<N;k++) { c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod; } c.m[i][j]%=mod; } return c; } Matrix quick_mod(Matrix a,LL k) { Matrix ans=I; while(k!=0) { if(k&1) { ans=multi(ans,a); } k>>=1; a=multi(a,a); } return ans; } int main() { LL k; int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9; while(~scanf("%lld%lld",&k,&mod)) { scanf("%d%d%d%d%d%d%d%d%d%d",&a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9); if(k<10) { printf("%d\n",k%mod); continue; } Matrix A={a0,a1,a2,a3,a4,a5,a6,a7,a8,a9, 1,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,1,0}; Matrix ans=quick_mod(A,k-9); LL t=((ans.m[0][0]*9)%mod+(ans.m[0][1]*8)%mod+(ans.m[0][2]*7)%mod+(ans.m[0][3]*6)%mod+(ans.m[0][4]*5)%mod+(ans.m[0][5]*4)%mod+(ans.m[0][6]*3)%mod+(ans.m[0][7]*2)%mod+(ans.m[0][8]*1)%mod+(ans.m[0][9]*0)%mod)%mod; printf("%lld\n",t); } return 0; }