简单矩阵,注意相乘的时候是a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
由于矩阵中0~9代表是f(i+0)~f(i+9) 所以a0~a9要逆序进最后一列。
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
using namespace std;
int mod,k;
struct matrix
{
int a[15][15];
}org,res;
matrix operator *(matrix x,matrix y)
{
matrix z;
memset(z.a,0,sizeof(z.a));
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
for(int k=0;k<10;k++)
{
z.a[i][j]+=x.a[i][k]*y.a[k][j];
z.a[i][j]%=mod;
}
}
}
return z;
}
int quick()
{
if (0<=k&&k<=9 )
return k;
k-=9;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<10;i++)
{
res.a[0][i]=i;
}
while(k)
{
if(k&1)
{
res=res*org;
}
k>>=1;
org=org*org;
}
return res.a[0][9];
}
int main()
{
while(~scanf("%d%d",&k,&mod))
{
memset(org.a,0,sizeof(org.a));
for(int i=0;i<10;i++)
{
scanf("%d",&org.a[9-i][9]);
}
for(int i=0;i<9;i++)
{
org.a[i+1][i]=1;
}
printf("%d\n",quick()%mod);
}
return 0;
}