[KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
来源:互联网 发布:dota后期三大核 知乎 编辑:程序博客网 时间:2024/06/08 21:20
题目梗概
给出一个不吉利数字
求有多少个n位数满足不包含不吉利数字。
解题思路
读完题目便能想到一个显然的数位DP,
考虑如何转移。
发现所有失配到j的状态都可以转移,所以要提前用KMP构造,假设我们构造出矩阵T。
但是发现还是超时。
接下来我们考虑这么修正答案:
这个显然可以用矩阵快速幂优化。
#include<cstdio>#include<cstring>using namespace std;const int maxn=25;int n,m,tt,nxt[maxn],sum;char s[maxn];struct jz{ int n,m,x[maxn][maxn];}T,ans;void make_nxt(){ for (int i=2,j=0;i<=m;i++){ while (j&&s[j+1]!=s[i]) j=nxt[j]; if (s[j+1]==s[i]) j++; nxt[i]=j; }}jz mul(jz a,jz b){ jz c;memset(c.x,0,sizeof(c.x)); c.n=a.n;c.m=b.m; for (int i=0;i<c.n;i++) for (int j=0;j<c.m;j++) for (int k=0;k<a.m;k++) c.x[i][j]=(c.x[i][j]+a.x[i][k]*b.x[k][j])%tt; return c;}jz qsm(jz x,int b){ jz c;memset(c.x,0,sizeof(c.x)); c.n=x.n;c.m=x.m; for (int i=0;i<=c.n;i++) c.x[i][i]=1; while(b>0){ if (b%2==1) c=mul(c,x); x=mul(x,x); b>>=1; } return c;}int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); scanf("%d%d%d",&n,&m,&tt); scanf("%s",s+1); make_nxt(); T.n=T.m=m; for (int i=0;i<m;i++) for (char j='0';j<='9';j++){ int k=i; while(k&&s[k+1]!=j) k=nxt[k]; if (s[k+1]==j) k++; if (k<m) T.x[i][k]=(T.x[i][k]+1)%tt; } ans.n=1,ans.m=m;ans.x[0][0]=1;ans=mul(ans,qsm(T,n)); for (int i=0;i<m;i++) sum=(sum+ans.x[0][i])%tt; printf("%d\n",sum); return 0;}
阅读全文
0 0
- [KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
- [KMP DP 矩阵快速幂加速] BZOJ 1009 [HNOI2008]GT考试
- BZOJ KMP+矩阵快速幂 1009: [HNOI2008]GT考试
- BZOJ 1009([HNOI2008]GT考试-KMP+矩阵加速Dp)
- BZOJ 1009: [HNOI2008]GT考试【KMP上DP+矩阵快速幂
- bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)
- BZOJ 1009: [HNOI2008]GT考试(DP+KMP失配+矩阵快速幂)
- BZOJ 1009: [HNOI2008]GT考试 AC自动机+矩阵快速幂
- 【KMP+矩阵加速】BZOJ1009[HNOI2008]GT考试
- [BZOJ 1009][HNOI2008]GT考试(KMP+线性齐次递推的矩阵加速?+DP)
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
- bzoj 1009: [HNOI2008]GT考试 KMP+矩阵乘法
- 【BZOJ】1009 [HNOI2008]GT考试 KMP+DP+矩阵优化
- BZOJ 1009 GT考试 KMP+DP+矩阵快速幂
- BZOJ 1009-GT考试(kmp+矩阵快速幂+DP)
- BZOJ 1009 GT考试 KMP+矩阵快速幂.
- BZOJ1009 [HNOI2008]GT考试(KMP算法+矩阵加速dp)
- BZOJ1009 [HNOI2008]GT考试【kmp+矩阵加速DP】
- VS2017上执行VS2013项目错误MSB802之解决方案
- Mapreduce模型
- Android ActionBar应用实战,高仿微信主界面的设计
- 算法竞赛入门——因子和阶乘
- 矩阵乘法与运用
- [KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
- 第一章:1.2.2系统分类(一)
- CSS, JavaScript, jQuery实现标签页切换
- 安装包cmake后可否删除源文件?
- H5知识点
- 20170814_深度探索C++对象模型
- QT中QWidget、QDialog及QMainWindow的区别
- 生信脚本练习(10)找出fasta文件中最长的转录本
- 多条目展示