很不错的题目
wyl的题解写的太好了所以我就不多废话了
//kmp+matrix+dp
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 900
using namespace std;
int n,m,a[1000],mod;
int next[1000+90];
struct wbysr_matrix
{
int n,m;
int a[MAX][MAX];
inline void init(int tn,int tm)
{
n=tn;
m=tm;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
a[i][j]=0;
}
void print()
{
for(int i=0;i<n;i++,printf("\n"))
for(int j=0;j<m;j++)
printf("%d ",a[i][j]);
}
}e,dp;
inline wbysr_matrix operator *(const wbysr_matrix &a,const wbysr_matrix &b)
{
if(a.m!=b.n)
return a;
wbysr_matrix c;
c.init(a.n,b.m);
for(int i=0;i<a.n;i++)
for(int j=0;j<b.m;j++)
for(int k=0;k<a.m;k++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return c;
}
inline wbysr_matrix pow(wbysr_matrix &a,int x)
{
if(x==1)
return a;
wbysr_matrix b=pow(a,x>>1);
b=b*b;
if(x%2)
b=a*b;
return b;
}
void kmp_get_next()
{
int j=0;
next[1]=0;
for(int i=2;i<=m;i++)
{
while(j>0&&a[j+1]!=a[i])
j=next[j];
if(a[j+1]==a[i])
j++;
next[i]=j;
}
return;
}
void check(int &a1,int &a2)
{
a1+=a2;
while(a1>mod)
a1-=mod;
}
void make_dp_matrix()
{
for(int i=0;i<m;i++)
for(int j=0;j<=9;j++)
{
int t=i;
while(a[t+1]!=j&&t>0)
t=next[t];
if(a[t+1]==j)
t++;
if(t!=m)
dp.a[t][i]=(dp.a[t][i]+1)%mod;
}
//dp.print();
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=m;i++)
{
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
a[i]=ch-'0';
}
kmp_get_next();
e.init(m,1);
e.a[0][0]=1;
dp.init(m,m);
make_dp_matrix();
dp=pow(dp,n);
e=dp*e;
int ans=0;
for(int i=0;i<m;i++)
ans=(ans+e.a[i][0])%mod;
printf("%d\n",ans);
}