P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)
P3193 [HNOI2008]GT考试
思路:
设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为:
\]
这里\(a(j,k)\)就是从第\(j\)位到第\(k\)位的情况总数。那么根据这个转移方程我们就可以直接求解了。但是题目中\(N\)的范围过大,直接枚举可能要爆炸,我们这样考虑,将dp方程稍微变化一下:
那么这里的$a(k,j)$就相当于矩阵的一列,我们将$i-1$的状态与每一列相乘就可以得到$i$的所有状态。那么我们矩阵加速一下就好了。
注意在构造矩阵的时候,不要考虑最后一位就行了,这样就匹配成功了。
代码如下:
```cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 25, MAX = 10;
int n, m, K;
char s[N];
int nxt[N][MAX];
struct Matrix{
int n;
ll A[N][N];
Matrix() {
memset(A, 0, sizeof(A)) ;
}
void Print() {
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= n; j++) {
cout << A[i][j] << ' ' ;
}
cout << '\n' ;
}
}
}trans, dp;
Matrix operator * (const Matrix &a, const Matrix &b) {
Matrix ans;
ans.n = a.n;
for(int i = 0; i <= ans.n; i++)
for(int j = 0; j <= ans.n; j++)
for(int k = 0; k <= ans.n; k++)
ans.A[i][j] = (ans.A[i][j] + a.A[i][k] * b.A[k][j]) % K;
return ans;
}
Matrix qp(Matrix a, ll b) {
Matrix ans; ans.n = a.n;
for(int i = 0; i <= ans.n; i++) ans.A[i][i] = 1;
while(b) {
if(b & 1) ans = ans * a;
a = a * a;
b >>= 1;
}
return ans ;
}
void Get_nxt(char *s, int nxt[][MAX]) {
int L = strlen(s + 1) ;
for(int k = 0; k < L; k++) {
int l = k + 1;
for(int p = 0; p < MAX; p++) {
for(int i = min(l, L); i >= 0; i--) {
bool flag = true;
for(int j = 1; j < i; j++)
if(s[j] != s[l - i + j]) flag = false ;
if(s[i] - '0' != p) flag = false ;
if(flag) {
nxt[k][p] = i;
break ;
}
}
}
}
}
int main() {
cin >> n >> m >> K;
scanf("%s",s + 1) ;
Get_nxt(s, nxt) ;
int L = strlen(s + 1) ;
trans.n = dp.n = m;
for(int i = 0; i < m; i++) {
for(int p = 0; p < MAX; p++) {
int j = nxt[i][p] ;
if(j != m) trans.A[i][j]++;
}
}
dp.A[0][0] = 1 ;
trans = qp(trans, n) ;
ll ans = 0;
dp = dp * trans;
for(int i = 0; i < m; i++)
ans = (ans + dp.A[0][i]) % K ;
cout << ans ;
return 0;
}
```\]
P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)的更多相关文章
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
随机推荐
- 【MongoDB学习之四】索引 聚合 备份与恢复 监控
环境 MongoDB 4.0 CentOS 6.5_x64 一.索引语法ensureIndex()方法基本语法格式如下所示:>db.COLLECTION_NAME.ensureIndex({KE ...
- Tomcat总结四种部署方式
静态部署 一.Webapps 把项目复制到Tomcat的Webapps 把war包复制到Tomcat的Webapps下 *修改Webapps的默认路径: * Tomcat的conf目录下的server ...
- spring boot连接mysql8.0
今天spring boot的项目数据库从mysql5.7换到mysql8.0,遇到点问题,特此记录下来 查看mysql的版本 mysql> select version();+--------- ...
- .net桌面程序或者控制台程序使用NLog时的注意事项
Nuget添加NLog 添加nlog.config文件,并选择属性->始终复制 不选择始终复制,编译后nlog.config是没有的. 具体使用: private static readonly ...
- 配置SSH无密码登录【原著】
环境:两台Centos虚拟机,配置了静态的ip.(详见虚拟机如何配置静态的IP地址的操作步骤) 192.168.75.21192.168.75.22 第一步:为每台服务器配置静态IP地址参见: 虚拟机 ...
- shell 编写脚本批量Ping IP
服务器总是一下子买了很多的段的ip.通过绑定后,也不知道这些ip是否绑定成功,所以就写了一个shell脚本,把ip输好,批量ping一下,看是不是都能ping通. 脚本如下: 此外.还有一个ip文件, ...
- 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)
我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...
- 【转】pdf文件自动切白边
pdf文件自动剪裁(自动切白边) FROM:http://www.ai7.org/wp/html/754.html 可能用到的环境.工具:Ubuntu 10.04+TeXLive 2008+pdfcr ...
- cocos creator图片渲染问题!
问题:游戏项目需要添加一个开场剧情(); 第一时间使用了cc.component.scheduleOnce (), 里面的回调函数为 cc.loader.loadRes(). 进入游戏时,渲染主场景后 ...
- 用C#实现Rabbitmq应用的小实例
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有主要 ...