說實在話,這題在湖南省選中實屬簡單,
但我就是太弱了不會
咱們用kmp預處理出從i位匹陪到j位的方案數g[i][j]
而後就能夠矩陣優化了。c++
#include<bits/stdc++.h> using namespace std; const int N=26; int n,m,k,t=0,ans=0,nxt[N],g[N][N]; char c[36]; struct matrix{int z[N][N]; void clr(){memset(z,0,sizeof(z));}}f,G; inline int read(){ int T=0,F=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();} while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar(); return F*T; } matrix operator * (matrix u,matrix v){ matrix w; w.clr(); for(int i=0;i<m;++i) for(int j=0;j<m;++j) for(int p=0;p<m;++p) w.z[i][j]=(w.z[i][j]+u.z[i][p]*v.z[p][j]%k)%k; return w; } matrix ksm(matrix u,int v){ matrix base=u,answer=u; --v; while(v){ if(v&1) answer=answer*base; base=base*base,v>>=1; } return answer; } int main(){ n=read(),m=read(),k=read(),scanf("%s",c); for(int i=1;i<m;++i){ while(t&&c[t]!=c[i]) t=nxt[t]; if(c[t]==c[i]) ++t; nxt[i+1]=t; } for(int i=0;i<m;++i) for(char j='0';j<='9';++j){ t=i; while(t&&c[t]!=j) t=nxt[t]; if(c[t]==j) ++t; if(t<m) ++g[i][t]; } for(int i=0;i<m;++i) for(int j=0;j<m;++j) G.z[i][j]=g[i][j]; f.z[0][0]=1,f=f*ksm(G,n); for(int i=0;i<m;++i) ans=(ans+f.z[0][i])%k; printf("%d\n",ans); return 0; }