题解:
kmp
然后列出来矩阵
加上快速幂即可
代码:
#include<bits/stdc++.h> using namespace std; const int N=30; int n,m,M,p[N],a[N][N],b[N][N]; char ch[N]; void mul(int a[N][N],int b[N][N],int ans[N][N]) { int tmp[N][N]; for (int i=0;i<m;i++) for (int j=0;j<m;j++) { tmp[i][j]=0; for (int k=0;k<m;k++)tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j])%M; } for (int i=0;i<m;i++) for (int j=0;j<m;j++)ans[i][j]=tmp[i][j]; } int main() { scanf("%d%d%d",&n,&m,&M); scanf("%s",ch+1); int j=0; for (int i=2;i<=m;i++) { while (j>0&&ch[j+1]!=ch[i])j=p[j]; if(ch[j+1]==ch[i])j++; p[i]=j; } for (int i=0;i<m;i++) for (int j=0;j<=9;j++) { int t=i; while (t>0&&ch[t+1]-'0'!=j)t=p[t]; if (ch[t+1]-'0'==j)t++; if (t!=m)b[t][i]=(b[t][i]+1)%M; } for (int i=0;i<m;i++)a[i][i]=1; while (n) { if (n&1)mul(a,b,a); mul(b,b,b); n>>=1; } int sum=0; for (int i=0;i<m;i++)sum=(sum+a[i][0])%M; printf("%d",sum); return 0; }