引用两篇大佬的文章:
https://blog.csdn.net/zjtzyrc/article/details/45287233
https://blog.csdn.net/hnust_xiehonghao/article/details/8175467
他们两篇文章对这个题讲解已经很透彻了,我目前还不明白如何构造矩阵。。。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int m,k;
int cur[10];
struct Matrix{
int map[10][10];
};
Matrix mul(Matrix a,Matrix b) //矩阵乘法
{
Matrix temp;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
temp.map[i][j]=0;
for(int k=0;k<10;k++)
{
temp.map[i][j]=(temp.map[i][j]+(a.map[i][k]*b.map[k][j])%m)%m;
}
}
}
return temp;
}
long long poww(int k) //快速幂
{
Matrix base,ans;
memset(base.map,0,sizeof(base.map)); //要初始化这两个二维数组啊,不然WA
memset(ans.map,0,sizeof(ans.map));
for(int i=0;i<10;i++)
{
base.map[0][i]=cur[i];
if(i!=9)
base.map[i+1][i]=1;
ans.map[i][0]=9-i;
}
while(k)
{
if(k&1)
{
ans=mul(base,ans);
}
base=mul(base,base);
k>>=1;
}
return ans.map[0][0];
}
int main()
{
while(scanf("%lld",&k)!=EOF) //注意K的范围
{
scanf("%d",&m);
for(int i=0;i<10;i++)
scanf("%d",&cur[i]);
printf("%d\n",poww(k-9)%m);
}
return 0;
}