bzoj1009(kmp+dp+矩阵快速幂优化)必需复习

来源:互联网 发布:东软医保软件 编辑:程序博客网 时间:2024/06/08 06:48

挖个坑,这个矩阵乘法必须复习

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;inline int read(){int ans,f=1;char ch;while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';return ans*f;}struct mat{int m[30][30];}a,b;int mod,n,m,f[50];char ch[50];mat operator *(const mat &a,const mat &b){mat c;memset(c.m,0,sizeof(c.m));//必需的 for (int i=0;i<m;i++)for (int j=0;j<m;j++){for (int k=0;k<m;k++)c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;}return c;}int main(){n=read();m=read();mod=read();scanf("%s",ch+1);int j=0;for (int i=2;i<=m;i++){while (ch[j+1]!=ch[i]&&j) j=f[j];if (ch[j+1]==ch[i]) j++;f[i]=j;}for (int i=0;i<m;i++)for (int j=0;j<=9;j++){int t=i;while (t&&ch[t+1]-'0'!=j) t=f[t];if (ch[t+1]-'0'==j) t++;if (t!=m) b.m[t][i]++;}for (int i=0;i<m;i++) a.m[i][i]=1;while (n){if (n&1) a=a*b;b=b*b;n>>=1;}int ans=0;for (int i=0;i<m;i++) ans=(ans+a.m[i][0])%mod;printf("%d",ans);return 0;}


0 0
原创粉丝点击