BZOJ 1009 [HNOI 2008] GT考试
2017-04-06 11:00
411 查看
这题可以用kmp+dp做出来
设a[k][j]为第k位后加一个数,是第j个数字的个数,这里a数组可以用kmp做出
dp方程 f[i][j]=∑0<=k<mf[i−1][k]+a[k][j]
然后,因为是线性dp,可以用矩阵快速做出来
设a[k][j]为第k位后加一个数,是第j个数字的个数,这里a数组可以用kmp做出
dp方程 f[i][j]=∑0<=k<mf[i−1][k]+a[k][j]
然后,因为是线性dp,可以用矩阵快速做出来
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std ; int n,m,mod; int ans=0; typedef struct matrix{ int n,m; int num[30][30]; matrix (int a,int b){ n=a,m=b; memset (num,0,sizeof(num)); } matrix operator * (matrix & b){ matrix ans (this->n,b.m); int i,j,k; for (i=0;i<ans.n;i++){ for (j=0;j<ans.m;j++){ for (k=0;k< this->m;k++){ ans.num[i][j]=(ans.num[i][j]+((long long)this->num[i][k]*b.num[k][j])%mod)%mod; } } } return ans; } }M; char c[100]; int next[100]; void init (){ scanf ("%d %d %d\n",&n,&m,&mod); int i; for (i=0;i<m;i++){ scanf ("%c",&c[i]); } } void getnext(){ int i,j; next[0]=next[1]=0; for(i=1;i<m;i++){ j=next[i]; while(j&&c[i]!=c[j]) j=next[j]; next[i+1]=c[i]==c[j] ? j+1 : 0; } } matrix ksm(matrix a,int b){ matrix ans(a.n,a.m); int i; for(i=0;i<ans.n;i++) ans.num[i][i]=1; while(b){ if(b&1) ans=ans*a; a=a*a; b>>= 1; } return ans; } int main (){ init (); int i,k; char j; getnext (); matrix f(m,m); for(i=0;i<m;i++){ for(j='0';j<='9';j++){ k=i; while(k&&c[k]!=j) k=next[k]; if(c[k]==j) k++; if(k!=m) f.num[i][k]++; } } f=ksm (f,n); matrix a(1,m); a.num[0][0]=1; a=a*f; for(i=0;i<m;i++){ ans=(ans+a.num[0][i])%mod; } printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ 1009--[HNOI2008]GT考试【KMP算法】【矩阵优化线性递推】
- BZOJ 1009: [HNOI2008]GT考试(DP+KMP失配+矩阵快速幂)
- [KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
- BZOJ1009: [HNOI2008]GT考试
- 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
- 【bzoj1009】[HNOI2008]GT考试
- BZOJ1009 - [HNOI2008]GT考试
- 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)
- bzoj1009: [HNOI2008]GT考试
- 【BZOJ 1009】 [HNOI2008]GT考试
- _bzoj1009 [HNOI2008]GT考试【矩阵加速dp】
- [HNOI2008] [BZOJ1009] GT考试
- [矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
- BZOJ KMP+矩阵快速幂 1009: [HNOI2008]GT考试
- bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)
- BZOJ 1009 [HNOI2008]GT考试
- BZOJ 1009([HNOI2008]GT考试-KMP+矩阵加速Dp)
- 【BZOJ 1009】 [HNOI2008]GT考试
- BZOJ 1009 HNOI 2008 GT考试 AC自动机+矩阵乘法
- BZOJ1009 [HNOI2008]GT考试 矩阵