引用两篇大佬的文章:
https://blog.csdn.net/zjtzyrc/article/details/45287233
https://blog.csdn.net/hnust_xiehonghao/article/details/8175467
他们两篇文章对这个题讲解已经很透彻了,我目前还不明白如何构造矩阵。。。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long int num,mod;
long long int danwei[11];
struct node
{
long long int map[10][10];
}ans,base;
node mulit(node a,node b)
{
node c;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
c.map[i][j]=0;
for(int k=0;k<10;++k)
{
c.map[i][j]+=(b.map[i][k]*a.map[k][j])%mod;
}
}
}
return c;
}
long long int poww(long long int k)//¾ØÕó¿ìËÙÃÝ
{
int i;
memset(ans.map,0,sizeof(ans.map));
memset(base.map,0,sizeof(base.map));
for(int i=0;i<10;i++)
{
base.map[0][i]=danwei[i];
if(i!=9)
base.map[i+1][i]=1;
}
for(i=0;i<10;i++)
{
ans.map[i][0]=9-i;
}
while(k!=0)//¾ØÕó¿ìËÙÃݵĺËÐIJ¿·Ö
{
if(k&1!=0)
{
ans=mulit(ans,base);
}
base=mulit(base,base);
k>>=1;
}
return ans.map[0][0];
}
int main()
{
while(scanf("%lld%lld",&num,&mod)!=EOF)
{
int i;
for(i=0;i<10;i++)
{
scanf("%lld",&danwei[i]);
}
if(num<10) cout<<num<<endl;
else
cout<<poww(num-9)%mod<<endl;// ´Ó10¿ªÊ¼£¬Òò´Ë¼õ9
}
return 0;
}