矩阵快速幂的水题
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<iomanip>
using namespace std;
struct aa
{
int a[11][11];
};
int mod;
aa f(aa m,aa n)
{
aa ans;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
ans.a[i][j]=0;
for(int k=0;k<10;k++)
ans.a[i][j]+=m.a[i][k]*n.a[k][j];
ans.a[i][j]%=mod;
}
return ans;
}
aa mul(aa m,long k)
{
aa ans;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
ans.a[i][j]=(i==j);
while(k)
{
if(k&1)
{
ans=f(ans,m);
}
k>>=1;
m=f(m,m);
}
return ans;
}
int main()
{
long n,sum;
int i,j;
while(scanf("%d%d",&n,&mod)!=EOF)
{
aa p,ans;
memset(p.a,0,sizeof(p.a));
for(i=0;i<10;i++)
{
scanf("%d",&p.a[0][i]);
}
for(i=1;i<10;i++)
p.a[i][i-1]=1;
sum=0;
if(n<10)
sum=n;
else
{
ans=mul(p,n-9);
for(i=0;i<10;i++)
sum+=ans.a[0][i]*(9-i);
}
printf("%d\n",sum%mod);
}
return 0;
}