去网上找了一堆题解才看懂0.0 这里写的稍微详细一点吧
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct matrix{
int xx[22][22];
int* operator [] (int x)
{
return xx[x];
}
}a,b;
int n,m,p,ans;
char s[100];
int next[100];
void operator *= (matrix &x,matrix &y)
{
int i,j,k;
matrix z;
memset(&z,0,sizeof z);
for(i=0;i<m;i++)
for(j=0;j<m;j++)
for(k=0;k<m;k++)
z[i][j]+=x[i][k]*y[k][j],z[i][j]%=p;
x=z;
}
void KMP()
{
int i,fix=0;
char j;
for(i=2;i<=m;i++)
{
while( fix && s[fix+1]!=s[i] ) fix=next[fix];
if( s[fix+1]==s[i] ) ++fix;
next[i]=fix;
}
for(i=0;i<m;i++)
for(j='0';j<='9';j++)
{
fix=i;
while( fix && s[fix+1]!=j ) fix=next[fix];
if( j==s[fix+1] ) b[i][fix+1]++;
else b[i][0]++;
}
}
void Quick_Power(int x)
{
while(x)
{
if(x&1)a*=b;
b*=b;
x>>=1;
}
}
int main()
{
int i;
cin>>n>>m>>p;
scanf("%s",s+1);
KMP();
for(i=0;i<m;i++)
a[i][i]=1;
Quick_Power(n);
for(i=0;i<m;i++)
ans+=a[0][i],ans%=p;
cout<<ans<<endl;
}
BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
原文:http://blog.csdn.net/popoqqq/article/details/40188173