记录编号 414781 评测结果 AAAAAAAAAA
题目名称 [HNOI 2008]GT考试 最终得分 100
用户昵称 GravatarHzoi_Ivan 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2017-06-14 21:48:14 内存使用 0.00 MiB
显示代码纯文本
#define fastcall __attribute__((optimize("-O3"))) 
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 22
using namespace std;
int n,m,mod,ans,A[N][N],B[N][N],nxt[N];
char s[N];
void mul(int a[22][22],int b[22][22],int c[22][22])
{
     int d[22][22];
     for(int i=0;i<m;i++)
       for(int j=0;j<m;j++)
       {
          d[i][j]=0;
          for(int k=0;k<m;k++)
            d[i][j]=(d[i][j]+a[i][k]*b[k][j])%mod;
       }
     for(int i=0;i<m;i++)
       for(int j=0;j<m;j++)
         c[i][j]=d[i][j];
}
void kmp(){
	for(int i=0;i<m;i++)
    {
      for(int j=0;j<=9;j++)
      {
        int ii=i;
        while(~ii&&s[ii+1]-'0'!=j) ii=nxt[ii];
        ii++;
        A[ii][i]++;
        A[ii][i]%=mod;
      } 
    }
}
int haha(){
	freopen("bzoj_1009.in","r",stdin);
    freopen("bzoj_1009.out","w",stdout);
    scanf("%d%d%d",&n,&m,&mod);
    scanf("%s",s+1);
    nxt[0]=-1; nxt[1]=0;
    for(int i=2,j=0;i<=m;i++){
      while(~j&&s[i]!=s[j+1]) j=nxt[j];
      nxt[i]=++j;
    }
    kmp();
    for(int i=0;i<m;i++)
      B[i][i]=1;
    while(n)
    {
      if(n&1) mul(A,B,B);
      mul(A,A,A);
      n>>=1;
    }
    for(int i=0;i<m;i++)
      ans=(ans+B[i][0])%mod;
    printf("%d\n",ans);
    return 0;
}
int sb=haha();
int main(){;}