矩阵快速幂模版题,注意k<10的初值即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
const int N=10;
int k,mod,a[10];
using namespace std;
struct mat{
int m[N][N];
mat() {}
mat unit(){
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
m[i][j]=i==j?1:0;
}
};
mat t;
mat operator * (mat a,mat b){
mat res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++){
res.m[i][j]=0;
for(int k=0;k<N;k++)
res.m[i][j]+=((a.m[i][k]%mod)*(b.m[k][j]%mod))%mod;
}
return res;
}
mat operator ^ (mat res,int n){
res.unit();
while(n>=1){
if(n&1)
res=res*t;
n=n>>1;
t=t*t;
}
return res;
}
void init(){
for(int i=0;i<N;i++)
t.m[i][0]=a[i];
for(int i=0;i+1<N;i++)
t.m[i][i+1]=1;
}
int main(){
//freopen("input.txt","r",stdin);
while(~scanf("%d%d",&k,&mod)){
memset(t.m,0,sizeof(t.m));
mat A;
int final=0;
for(int i=0;i<10;i++)
scanf("%d,",&a[i]);
if(k<10)
printf("%d\n",k%mod);
else{
init();
A=t^(k-9);
/*for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
printf("%d ",A.m[i][j]);
cout<<endl;
}*/
for(int i=0;i<=9;i++)
final+=(A.m[i][0]*(9-i))%mod;
final%=mod;
printf("%d\n",final);
}
}
return 0;
}