P3193 [HNOI2008]GT考试

思路:

设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为:

\[dp(i,j)=dp(i+1,k)*a(j,k)
\]

这里\(a(j,k)\)就是从第\(j\)位到第\(k\)位的情况总数。那么根据这个转移方程我们就可以直接求解了。但是题目中\(N\)的范围过大,直接枚举可能要爆炸,我们这样考虑,将dp方程稍微变化一下:

\[dp(i,j)=\sum_{k=1}^mdp(i-1,k)*a(k,j)$$。
那么这里的$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)的更多相关文章

  1. [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法

    Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...

  2. BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)

    ---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...

  3. BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  4. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

  5. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  6. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  7. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  8. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

  9. 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

    原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...

随机推荐

  1. 恋恋山城 Jean de Florette (1986) 男人的野心 / 弗洛莱特的若望 / 让·德·弗罗莱特 / 水源 下一部 甘泉,玛侬

    <让·德·弗洛莱特>电影剧本 文/[法]马赛尔·巴涅尔译/苏原 编者按:<让·德·弗洛莱特>和<甘泉,玛侬>是根据法国著名作家马赛尔·巴涅尔的同名小说改编的电影.马 ...

  2. 【springcloud】【idea】启动服务报错Command line is too long. Shorten command line for XXXApplication or also for Spring Boot default configuration.

    在workspace.xml 在标签<component name="PropertiesComponent">里 添加<property name=" ...

  3. Python定时偷取妹子Chrome上网记录

    原文:教大家一招用Python实时监控自己的女朋友每天上网都在做什么! 参考这个思路,尝试自己实现一下 读取Chrome历史记录文件 1.文件可在以下路径找到,这是个sqllite数据库文件 C:\U ...

  4. 基于redis+lua实现高并发场景下的秒杀限流解决方案

    转自:https://blog.csdn.net/zzaric/article/details/80641786 应用场景如下: 公司内有多个业务系统,由于业务系统内有向用户发送消息的服务,所以通过统 ...

  5. aspnetcore identity result.Succeeded SignInManager.IsSignedIn(User) false?

    登陆返回的是 result.Succeeded 为什么跳转到其他页面SignInManager.IsSignedIn(User)为false呢? result.Succeeded _signInMan ...

  6. Linux 服务器管理建议

    Linux 服务器管理建议 一.学习Linux 的注意事项 Linux 严格区分大小写 Linux 一切皆文件 Linux 不靠扩展名区分文件类型 靠权限位标识来确定的 特殊文件要求写扩展名(给管理员 ...

  7. 在local模式下的spark程序打包到集群上运行

    一.前期准备 前期的环境准备,在Linux系统下要有Hadoop系统,spark伪分布式或者分布式,具体的教程可以查阅我的这两篇博客: Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分 ...

  8. Equalizing Two Strings CodeForces - 1256F (思维)

    大意: 给定两个串$s,t$, 每次操作任选长度$len$, 分别翻转$s,t$中一个长$len$的子串, 可以进行任意次操作, 求判断能否使$s$和$t$相同. 字符出现次数不一样显然无解, 否则若 ...

  9. ElasticSearch 调优

    来源:http://tinyurl.com/y4gnzbje 第一部分:调优索引速度 第二部分-调优搜索速度 英文原文:https://www.elastic.co/guide/en/elastics ...

  10. phpdocmentor 生成php 开发文档(转载)

    PHPDocumentor是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档.老的版本是phpdoc,从1.3.0开始,更名为phpDocument ...