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;
}