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$位,那 ...
随机推荐
- pandas-Notes1
#coding = utf-8 import pandas as pd import numpy as np import matplotlib as plt # series, like vecto ...
- nRF52-PCA10040——Overview
Overview Zephyr applications use the nrf52_pca10040 board configuration to run on the nRF52 Developm ...
- 新游发布:《Don't touch the color》
这是笨猫工作室最后一个Scratch 2.0游戏,经过笨猫工作室成员的不懈努力,游戏终于可以稳定运行.此次更新添加了最高分数显示,优化了系统流畅度.快来试玩吧!!! 卡搭蓝链:https://kada ...
- Java中的数据类型和引用
JAVA数据类型分primitive数据类型和引用数据类型. Java中的primitive数据类型分为四类八种.primitive也不知道怎么翻译比较贴切, 暂且叫他基本数据类型吧, 其实直接从英文 ...
- 【水】ZYH记
我从十二岁起,便在sdoj的蒟蒻餐厅里当伙计,root说,样子太傻,怕侍候不了专职切题,就在外面做点事罢.外面的调试管理,虽然容易说话,但唠唠叨叨缠夹不清的也很不少.他们往往要亲眼看着一个字一个字编译 ...
- ubuntu检测到系统错误解决方法
解决方案: 1.打开终端,输入 sudo gedit /etc/default/apport 2.把里面的enabled=1改成enabled=0,保存
- SpringMVC对于跨域访问的支持
原文地址:http://docs.spring.io/spring/docs/5.0.0.RC2/spring-framework-reference/web.html#mvc-introductio ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU——1215七夕节(因数和)
七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...