zoukankan      html  css  js  c++  java
  • bzoj1009

    题解:

    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;
    }
  • 相关阅读:
    js加入购物车抛物线动画
    mysql模糊查询like/REGEXP
    Servlt入门
    JSON详解
    AJAX技术初级探索
    css与js基础
    JDBC
    数据库
    反射
    网络编程
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8625336.html
Copyright © 2011-2022 走看看