【洛谷 P3193】 [HNOI2008]GT考试(KMP,dp,矩阵乘法)
题目链接
\(f[i][j]\)表示准考证号到第\(i\)位,不吉利数字匹配到第\(j\)位的方案数。
答案显然是\(\sum_{i=0}^{m-1}f[n][i]\)
\(f[i][j]=\sum_{k=1}^{m-1}f[i-1][k]*g[k][j]\)
\(g[i][j]\)表示不吉利数字匹配到第\(i\)位后加一个数字能匹配到第\(j\)位的方案数,因为这个数字是固定的,可以通过\(kmp\)求出来。
然后观察到\(f[i][j]\)的递推式是个矩阵,用矩阵快速幂加速即可。
#include <cstdio>
#include <cstring>
const int MAXM = 22;
char a[MAXM];
int nxt[MAXM], g[MAXM][MAXM], f[MAXM], tmp[MAXM][MAXM], temp[MAXM];
int n, m, mod, ans;
void gg(){
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= m; ++j){
tmp[i][j] = 0;
for(int k = 1; k <= m; ++k)
(tmp[i][j] += g[i][k] * g[k][j]) %= mod;
}
for(int i = 1; i <= m; ++i)
for(int j = 1; j <= m; ++j)
g[i][j] = tmp[i][j];
}
void gf(){
for(int i = 1; i <= m; ++i){
temp[i] = 0;
for(int j = 1; j <= m; ++j)
(temp[i] += f[j] * g[j][i]) %= mod;
}
for(int i = 1; i <= m; ++i) f[i] = temp[i];
}
void fast_pow(int k){
while(k){
if(k & 1) gf();
gg(); k >>= 1;
}
}
int main(){
scanf("%d%d%d%s", &n, &m, &mod, a + 1);
int p = 0;
for(int i = 2; i <= m; ++i){
while(a[i] != a[p + 1] && p) p = nxt[p];
if(a[i] == a[p + 1]) ++p;
nxt[i] = p;
}
for(int i = 0; i < m; ++i)
for(int j = '0'; j <= '9'; ++j){
int tmp = i;
while(a[tmp + 1] != j && tmp) tmp = nxt[tmp];
if(a[tmp + 1] == j) ++tmp;
if(tmp < m) ++g[i + 1][tmp + 1];
}
f[1] = 1;
fast_pow(n);
for(int i = 0; i <= m; ++i)
(ans += f[i]) %= mod;
printf("%d\n", ans);
return 0;
}
【洛谷 P3193】 [HNOI2008]GT考试(KMP,dp,矩阵乘法)的更多相关文章
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...
- 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...
- 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2745 Solved: 1694[Submit][Statu ...
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...
- 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解
看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...
- 洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
题意 题目链接 Sol 设\(f[i][j]\)表示枚举到位置串的第i位,当前与未知串的第j位匹配,那么我们只要保证在转移的时候永远不会匹配即可 预处理出已知串的每个位置加上某个字符后能转移到的位置, ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
随机推荐
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- [BUAA软工]Alpha阶段事后分析
设想和目标 虽然我们是从零开始的一个自定义项目,但语音Coding助手从一开始的设计与目标就很明确:加入语音接口使其能在shell端实现命令语音实现以及编辑运行脚本,设计前端编辑器并将后端shell与 ...
- 团队作业-Beta版本演示
组长博客链接 https://www.cnblogs.com/cmlei/p/12063671.html 本组成员 031702431 陈明磊 组长 031702227 林镕炜 031702413 韩 ...
- VS2013下开发VC++程序,编译时提示错误error MSB8020: The build tools for v140 (Platform Toolset = 'v140') 的解决方案
1. 问题描述: 提示如下错误:error MSB8020: The builds tools for v140 (Platform Toolset = 'v140') cannot be found ...
- [转]OpenGL图形渲染管线、VBO、VAO、EBO概念及用例
直接给出原文链接吧 1.OpenGL图形渲染管线.VBO.VAO.EBO概念及用例 2.OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及 ...
- 详解python3如何调用c语言代码
本文链接:https://blog.csdn.net/u012247418/article/details/80170690开发环境linux: python3.5.2 + ubuntu-gnome- ...
- mariadb 10.2/mysql 8.0实现递归
借助mysql 8.0的cte(它是iso sql标准的一部分),可以实现递归,mariadb 10.2.2开始支持递归cte,如下: +----+----------+--------------+ ...
- 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
.net mvc项目在做上传文件时,出现这个问题,上传文件的是通过表单提交,后台是通过请求里面获取文件信息的 1.问题截图: 堆栈信息 “/”应用程序中的服务器错误.超过了最大请求长度.说明: 执行当 ...
- EOS 数据库RAM使用量的计算
如果你是EOS的合约开发者,相信你很有可能跟我一样对内存(RAM)的使用量感到不解.在使用multi_index进行数据存储时,明明只存了一点数据,但区块链浏览器中显示的内存占用量却上升了不少.在这篇 ...
- docker安装并运行rabbitmq
拉取镜像: [mall@VM_0_7_centos ~]$ [sudo] password for mall: : Pulling from library/rabbitmq 5b7339215d1d ...