HDU1757链接(https://vjudge.net/problem/22253/origin)
**
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
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.
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
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
int n=10;
ll m;
ll mod;
struct node{
ll ma[20][20];
}; //结构体
node mul(node a,node b){
node ans;
memset(ans.ma,0,sizeof(ans.ma));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
ans.ma[i][j]=(ans.ma[i][j]+(a.ma[i][k]*b.ma[k][j]))%mod;
return ans;
} //a矩阵*b矩阵
node ksl(node a,ll b)
{
node res;
memset(res.ma,0,sizeof(res.ma));
for(int i=1;i<=n;i++) res.ma[i][i]=1;
while(b){
if(b&1) res=mul(res,a);
b>>=1;
a=mul(a,a);
}
return res;
} //a矩阵的b次幂
int main()
{
while(scanf("%lld%lld",&m,&mod)!=EOF)
{
node de,me;
memset(de.ma,0,sizeof(de.ma));
memset(me.ma,0,sizeof(me.ma));
for(int j=1;j<=10;j++)
cin>>de.ma[1][j]; //输入
if(m<10) {
cout<<m<<endl;
}
else{
for(int i=1;i<=9;i++)
de.ma[i+1][i]=1;
//
// for(int i=1;i<=10;i++){
// for(int j=1;j<=10;j++)
// cout<<de.ma[i][j]<<' ';
// cout<<' '<<endl;
// }
//
// cout<<' '<<endl; 用于调试
node sum,kum;
memset(sum.ma,0,sizeof(sum.ma));
memset(kum.ma,0,sizeof(kum.ma));
sum=ksl(de,m-9);
for(int i=1;i<=10;i++)
me.ma[i][1]=10-i;
kum=mul(sum,me);
//
// for(int i=1;i<=10;i++){
// for(int j=1;j<=10;j++)
// cout<<kum.ma[i][j]<<' ';
//
// }
//
cout<<kum.ma[1][1]<<endl;
}
}
return 0;
}
**