BZOJ1009GT考试 DP + KMP + 矩陣快速冪
@[DP, KMP, 矩陣快速冪]
Description
阿申准备报名参加GT考试,准考证号为\(N\)位数\(X_1 X_2 .. X_n(0 <= X_i <= 9)\),他不希望准考证号上出现不吉利的数字。
他的不吉利数学\(A_1 A_2 .. A_m (0 <= A_i <= 9)\)有M位,不出现是指\(X_1 X_2 .. X_n\)中没有恰好一段等于\(A_1 A_2 .. A_m\). \(A_1\)和\(X_1\)可以为\(0\)
Input
第一行输入\(N,M,K\).接下来一行输入\(M\)位的数。 \(N<=10^9,M<=20,K<=1000\)
Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
Sample Input
4 3 100
111
Sample Output
81
Solution
很容易想到DP方程
\]
\]
其中, \(f[i][j]\)表示考號第\(i\)位匹配到不吉利串第\(j\)位時的情況數; \(trans[k][j]\)記錄上一位位匹配至不吉利串中的第\(k\)位時, 填入\(num \in [1, 10)\)使得當前位匹配至不吉利串第\(j\)位的\(num\)數(實際上這個數量只能是\(1\)或者\(9\))
然後就會發現, \(i\)最大可以達到\(10^{9}\), 因此時間複雜度必須要優化.
想到矩陣快速冪, 發現可以直接將\(f\)整個省略掉, 只要求出\(trans^{n}\)即可
至於\(trans\)數組, 通過KMP算法與處理一下就好了
然後就可以直接看代碼了
#include<cstdio>
#include<cstring>
using namespace std;
const int M = 1 << 5;
int n, m, K;
char a[M];
int pre[M];
int trans[M][M];
int ans[M][M];
void mul(int a[M][M], int b[M][M], int res[M][M])
{
int tmp[M][M];
for(int i = 0; i < m; i ++)
for(int j = 0; j < m; j ++)
{
tmp[i][j] = 0;
for(int k = 0; k < m; k ++)
tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % K;
}
for(int i = 0; i < m; i ++)
for(int j = 0; j < m; j ++)
res[i][j] = tmp[i][j];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ1009.in", "r", stdin);
freopen("BZOJ1009.out", "w", stdout);
#endif
scanf("%d%d%d", &n, &m, &K);
scanf("%s", a + 1);
for(int i = 1; i <= m; i ++)
*(a + i) -= '0';
pre[1] = 0;
for(int i = 2; i <= m; i ++)
{
int p = pre[i - 1];
while(p && (a[p + 1] != a[i]))
p = pre[p];
pre[i] = ((a[p + 1] == a[i]) ? (p + 1) : p);
}
memset(trans, 0, sizeof(trans));
for(int i = 0; i < m; i ++)
for(int j = 0; j < 10; j ++)
{
int p = i;
while(p && (a[p + 1] != j))
p = pre[p];
if(a[p + 1] == j)
p ++;
trans[p][i] = (trans[p][i] + 1) % K;
}
memset(ans, 0, sizeof(ans));
for(int i = 0; i < m; i ++)
ans[i][i] = 1;
while(n)
{
if(n & 1)
mul(ans, trans, ans);
mul(trans, trans, trans);
n >>= 1;
}
int sum = 0;
for(int i = 0; i < m; i ++)
sum = (sum + ans[i][0]) % K;
printf("%d", sum);
}
BZOJ1009GT考试 DP + KMP + 矩陣快速冪的更多相关文章
- B. Once Again... 解析(思維、DP、LIS、矩陣冪)
Codeforce 582 B. Once Again... 解析(思維.DP.LIS.矩陣冪) 今天我們來看看CF582B 題目連結 題目 給你一個長度為\(n\)的數列\(a\),求\(a\)循環 ...
- 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...
- 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)
[BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...
- 1235: 入学考试[DP]
1235: 入学考试 [DP] 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 12 统计 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4309 Solved: 2640[Submit][Statu ...
- [HNOI2008] GT考试(DP+矩阵快速幂+KMP)
题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ...
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...
- [BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那 ...
随机推荐
- Find a way HDU - 2612(bfs)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- linux笔记(1)
1)useradd+用户名 添加一个普通用户2)passwd+密码 为用户加密码3)su - 用户名 切换用户4)whoami 查看当前用户是什么5)$符号是普通用户#是超级用户6)mkdir /da ...
- activity-alias
activity-alias标签,它有一个属性叫android:targetActivity,这个属性就是用来为该标签设置目标Activity的,或者说它就是这个目标Activity的别名.至此我们已 ...
- python week08 并发编程之多进程--理论部分
一 什么是进程 进程:正在进行的一个过程或者说一个任务. 而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): Jame在一个时间段内有很多任务要做:python学习任 ...
- python踩坑系列——报错后修改了.py文件,但是依然报错
一开始.py文件中的函数名大小写错了,但是在终端是对的,报错: 'module' object has no attribute '某函数名' 后来就去修改.py文件.结果重新import该.py文件 ...
- linux各种版本查看方法
1.linux内核版本 cat /proc/version Linux version 4.13.0-39-generic (buildd@lgw01-amd64-038) (gcc version ...
- BFC浅析
1.定义 BFC(Block formatting context)即"块级格式化上下文".它是一个独⽴的渲染区域,只有Block-level box参与, 它规定了内部的Bloc ...
- phpMyAdmin操作之改管理员密码
1.登录phpMyAdmin 默认地址:http://localhost/phpmyadmin 2.点击用户按钮 3.往下拉找到修改密码 点执行就修改了 注意: 如果再次登录时报错提示: #1045 ...
- FOJ Problem 2256 迷宫
...
- 算法 & 数据结构——收纳箱算法???
. 最近工作上有一个需求,需要将图片打包成图集,以便于让资源更紧凑,利用率更高,提升性能,游戏行内的同志应该很熟练这个操作.通常我们需要用一个app来完成这项工作,最出名的莫过于Texture Pac ...