【矩阵乘】【KMP】【HNOI 2008】【bzoj 1009】GT考试
来源:互联网 发布:elf淘宝 编辑:程序博客网 时间:2024/06/16 06:22
1009: [HNOI2008]GT考试
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2230 Solved: 1364
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位的数。 100%数据N<=10^9,M<=20,K<=1000 40%数据N<=1000 10%数据N<=6
Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
Sample Input
4 3 100 111
Sample Output
81
题解:
首先想到dp,然后看到数据范围,于是自然想到矩阵乘。
对于转移找位置,可以使用kmp加速一下(据说可以暴力,然而lcomyn、Rivendell和fye大神写的都是AC自动机。。)
不知为何矩阵乘写错了有些悲伤。。在大神指导下写了一个奇怪的递归的矩阵乘。
Code:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>using namespace std;#define N 30char s[N];int n,m,p,l,ans=0,next[N],a[N][N],b[N][N],f[N][N];void init(){ l=strlen(s)+1; for (int i=l-2; i>=0; i--) s[i+1]=s[i]; s[0]=' '; for (int i=2; i<l; i++){ int x=next[i-1]; while (x && s[i]!=s[x+1]) x=next[x]; if (s[i]==s[x+1]) next[i]=x+1; } for (int i=0; i<l-1; i++) for (int j=0; j<=9; j++){ int x=i; while (x && j!=s[x+1]-'0') x=next[x]; if (j==s[x+1]-'0') f[i][x+1]++; else f[i][0]++; } memcpy(b,f,sizeof(f));}void jzc(int x){ if (x==1) return; if (x>3) jzc(x>>1); memset(a,0,sizeof(a)); for (int i=0; i<m; i++) for (int j=0; j<m; j++) for (int k=0; k<m; k++) a[i][j]=(a[i][j]+f[i][k]*f[k][j])%p; memcpy(f,a,sizeof(a)); if (x&1){ memset(a,0,sizeof(a)); for (int i=0; i<m; i++) for (int j=0; j<m; j++) for (int k=0; k<m; k++) a[i][j]=(a[i][j]+f[i][k]*b[k][j])%p; memcpy(f,a,sizeof(f)); }}int main(){ scanf("%d%d%d%s",&n,&m,&p,&s); init(); jzc(n); for (int i=0; i<m; i++) ans=(ans+f[0][i])%p; printf("%d\n",ans); return 0;}
1 0
- 【矩阵乘】【KMP】【HNOI 2008】【bzoj 1009】GT考试
- [省选前题目整理][BZOJ 1009][HNOI 2008]GT考试(KMP+DP+矩阵快速幂)
- [BZOJ 1009] HNOI 2008 GT考试 · 动态规划+矩阵乘法+KMP
- BZOJ 1009 [HNOI 2008] GT考试
- BZOJ 1009 HNOI 2008 GT考试 AC自动机+矩阵乘法
- BZOJ 1009([HNOI2008]GT考试-KMP+矩阵加速Dp)
- BZOJ KMP+矩阵快速幂 1009: [HNOI2008]GT考试
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
- BZOJ 1009 GT考试 KMP+DP+矩阵快速幂
- bzoj 1009: [HNOI2008]GT考试 KMP+矩阵乘法
- BZOJ 1009-GT考试(kmp+矩阵快速幂+DP)
- BZOJ 1009 GT考试 KMP+矩阵快速幂.
- 【BZOJ】1009 [HNOI2008]GT考试 KMP+DP+矩阵优化
- HNOI 2008 GT考试
- [KMP DP 矩阵快速幂加速] BZOJ 1009 [HNOI2008]GT考试
- BZOJ 1009: [HNOI2008]GT考试【KMP上DP+矩阵快速幂
- [BZOJ 1009][HNOI2008]GT考试(KMP+线性齐次递推的矩阵加速?+DP)
- BZOJ 1009--[HNOI2008]GT考试【KMP算法】【矩阵优化线性递推】
- 【leetcode每日一题】149.Max Points on a line
- Hibernate关联之一对一外键双向关联
- 二分查找的实现
- easyui之datagrid动态修改列
- 零基础学python-8.5 字典
- 【矩阵乘】【KMP】【HNOI 2008】【bzoj 1009】GT考试
- Ubuntu-14-04-安装PHP环境和反向代理
- App应用之启动界面SplashActivity的使用
- python写csv文件
- 【疑难杂症】Android studio 问题总结
- Android webview与js交互
- [c#]asp.net开发微信公众平台(1)数据库设计
- 分布式爬虫
- md5 加密java代码