【HNOI2008】bzoj1009 GT考试
2017-03-13 21:31
357 查看
Description
阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2…Am(0<=Ai<=9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am.
A1和X1可以为 0 Input
第一行输入N,M,K.接下来一行输入M位的数。 N<=10^9,M<=20,K<=1000 Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
用1×m的向量a表示处理了若干位以后,当前匹配了模式串的前i(0≤i<m)位的方案数。
每次用一个m×m的矩阵B转移,由前k位得到前k+1位。如果得到这个矩阵,只需要快速幂就可以解决问题了。
可以把矩阵B看成计数器,如果当前匹配了i位,枚举下一位填的数j,可以用kmp算出填了以后匹配到哪一位x,计数器bi,x加一。
阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2…Am(0<=Ai<=9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am.
A1和X1可以为 0 Input
第一行输入N,M,K.接下来一行输入M位的数。 N<=10^9,M<=20,K<=1000 Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
用1×m的向量a表示处理了若干位以后,当前匹配了模式串的前i(0≤i<m)位的方案数。
每次用一个m×m的矩阵B转移,由前k位得到前k+1位。如果得到这个矩阵,只需要快速幂就可以解决问题了。
可以把矩阵B看成计数器,如果当前匹配了i位,枚举下一位填的数j,可以用kmp算出填了以后匹配到哪一位x,计数器bi,x加一。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,p,next[25]; char s[25]; struct mat { int a[25][25]; void I() { for (int i=0;i<m;i++) for (int j=0;j<m;j++) a[i][j]=(i==j); } mat operator * (const mat &mm) const { mat ret; for (int i=0;i<m;i++) for (int j=0;j<m;j++) { ret.a[i][j]=0; for (int k=0;k<m;k++) ret.a[i][j]=(ret.a[i][j]+a[i][k]*mm.a[k][j]%p)%p; } return ret; } mat pow(int x) { mat ret,base; ret.I(); for (int i=0;i<m;i++) for (int j=0;j<m;j++) base.a[i][j]=a[i][j]; while (x) { if (x&1) ret=ret*base; base=base*base; x>>=1; } return ret; } void init() { int x; for (int i=2,j=0;i<=m;i++) { while (j&&s[i]!=s[j+1]) j=next[j]; if (s[i]==s[j+1]) j++; next[i]=j; } for (int i=0;i<m;i++) for (int j=0;j<=9;j++) { x=i; while (x&&s[x+1]!=j+'0') x=next[x]; if (s[x+1]==j+'0') x++; a[i][x]++; } } }a,b; int main() { int ans=0; scanf("%d%d%d",&n,&m,&p); scanf("%s",s+1); a.init(); b=a.pow(n); for (int i=0;i<m;i++) ans=(ans+b.a[0][i])%p; printf("%d\n",ans); }
相关文章推荐
- bzoj1009: [HNOI2008]GT考试 矩阵乘法
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
- 【bzoj1009】[HNOI2008]GT考试
- bzoj1009: [HNOI2008]GT考试
- 【DP+矩阵优化】[HNOI2008][HYSBZ/BZOJ1009]GT考试
- [BZOJ 1009][HNOI2008]GT考试(KMP+线性齐次递推的矩阵加速?+DP)
- _bzoj1009 [HNOI2008]GT考试【矩阵加速dp】
- [bzoj 1009] [HNOI2008]GT考试:DP,单串AC自动机,矩阵快速幂
- BZOJ 1009: [HNOI2008]GT考试
- BZOJ-1009-GT考试-HNOI2008
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
- [矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
- BZOJ KMP+矩阵快速幂 1009: [HNOI2008]GT考试
- BZOJ 1009 [HNOI2008]GT考试
- BZOJ1009: [HNOI2008]GT考试
- BZOJ 1009:[HNOI2008]GT考试
- 【bzoj1009】【HNOI2008】【GT考试】
- BZOJ1009 HNOI2008 GT考试
- BZOJ 1009 [HNOI2008]GT考试 矩阵乘法+DP
- BZOJ 1009 [HNOI2008]GT考试