Problem 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.
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
The problem contains mutiple test cases.Please process to the end of file.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
In each case, there will be two lines.
In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
In the second line , there are ten integers represent a0 ~ a9.
Output
For each case, output f(k) % m in one line.
Sample Input
10 9999 1 1 1 1 1 1 1 1 1 1 20 500 1 0 1 0 1 0 1 0 1 0
Sample Output
45 104
先分享一篇矩阵构造方法的文 http://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html
关于怎么构造矩阵的方法文中说的都很清楚,真的是很棒的文呢!
知道怎么构造矩阵方法,这道题就很简单了。
#include<stdio.h>
#include<string.h>
//[f(x-1),f(x-2),……f(x-9)]*A^(k-9)=[f(k),f(k-1),……,f(k-8)]
// A=[a0,1,0,0,0,0,0,0,0,0;a1,0,1,0,0,0,0,0,0,0;a2,0,0,1……]
int mol;
int A[10][10],resA[10][10];
int ans[10],res[10];
int main()
{
int k,m,i,j,n;
while(scanf("%d%d",&n,&mol)!=EOF)
{
memset(A,0,sizeof(A));
for(i=0;i<10;i++)
scanf("%d",&A[i][0]);
for(i=0;i<9;i++)
A[i][i+1]=1;
for(i=0;i<10;i++)
ans[i]=9-i;
if(n<10)
printf("%d\n",ans[n]);
else
{
n-=9;
while(n)
{
if(n&1)
{
//res=ans*A
memset(res,0,sizeof(res));
for(i=0;i<10;i++) //res 的列
{
for(j=0;j<10;j++) //A的行
res[i]=(res[i]+ans[j]*A[j][i])%mol;
}
for(i=0;i<10;i++)
ans[i]=res[i];
}
//A=A*A
memset(resA,0,sizeof(resA));
for(i=0;i<10;i++) //resA 的行
{
for(j=0;j<10;j++) //resA 的列
{
for(k=0;k<10;k++) //第二个A的行
resA[i][j]=(resA[i][j]+A[i][k]*A[k][j])%mol;
}
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
A[i][j]=resA[i][j];
n>>=1;
}
printf("%d\n",ans[0]);
}
}
return 0;
}