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$位,那 ...
随机推荐
- (转)iOS获取设备型号
//获得设备型号 + (NSString *)getCurrentDeviceModel:(UIViewController *)controller { ]; size_t len; char *m ...
- eclipse使用技巧的网站收集——转载(三)
本文来自:https://www.cnblogs.com/jeffen/p/5965227.html,未经更改,尊重作者 工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本 ...
- 某比赛小记1- 挑选第N大数字
题目:给1000个数字(有重复),从小到大排列后,挑选第N个数字. 数字文件如下:numbers.rar ,挑选第727个数字. java版本: //数组初始化 String str = " ...
- Android的初步探索之Context类
最近一直在学安卓,但由于JAVA的能力有限,学起应用开发来很吃力,众多错综复杂的类和界面组件弄的人焦头烂额,往往不知从何下手.... 各种名字冗长的方法和常量,没有任何界面编程的经验真是蛋疼死了.总是 ...
- CSS(非布局样式)
CSS(非布局样式) 问题1.CSS样式(选择器)的优先级 1.计算权重 2.!important 3.内联样式比外嵌样式高 4.后写的优先级高 问题2.雪碧图的作用 1.减少 HTTP 请求数,提高 ...
- P2598 [ZJOI2009]狼和羊的故事(最小割)
P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么 ...
- Hive学习笔记(二)
Hive内部表跟外部表之间的区别 创建外部表 先删除上面创建的表,指定location 此时在hdfs根目录下就有一个hivedata文件夹 上传文本数据到hivedata目录下 查询表中数据 删除上 ...
- Python ORM
本章内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句.如果 ...
- 令人惊叹的Chrome浏览器插件
Chrome是一个简洁而又高效(高性能,高消耗)的浏览器.接下来让我吐血推荐一些常用的Chrome插件. 日常插件 uBlock Origin ----- 比Adblock性能更高的广告插件. Adk ...
- Leetcode23--->Merge K sorted Lists(合并k个排序的单链表)
题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后 ...