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. html的rowspan和colspan

    https://www.jb51.net/article/165695.htm rowspan工具 https://blog.csdn.net/oxiaobaio/article/details/80 ...

  2. ABP .NETCore更新数据库时一直连接的之前数据库

    使用Update-Database -Verbose更新数据库时,在appsettings.json配置文件中已修改为新的连接字符串,但是使用命令更新数据库时仍然连接的是之前的数据库. 后来把代码移至 ...

  3. hashMap的原理

    hashMap的原理分析(转载) 1.总结: HashMap是基于哈希表实现的,用Entry[]来存储数据,而Entry中封装了key.value.hash以及Entry类型的next HashMap ...

  4. This is this

    首先,我们来了解一下 this 的几种绑定方式: this的默认绑定: 当一个函数没有明确的调用对象的时候,即作为独立函数调用时,this绑定到全局window对象. function func() ...

  5. JS实现文字转语音播放

    JS实现文字转语音播放背景实现方式第一种:百度文字转语音开放API第二种:微软TTS语音引擎第三种:SpeechSynthesisUtterance总结背景在做项目的过程中,经常会遇到场景是客户要求播 ...

  6. Nginx+Keepalived实现web服务器高可用

    1.Nginx 业务背景 现公司需求快速搭建web服务器,对外提供给用户web服务. 需求拆分 需要基于http协议的软件,搭建服务实现 介绍 常见用法: 1) web服务器软件 httpd http ...

  7. ELK 索引生命周期管理

    kibana 索引配置 管理索引 点击设置 --- Elasticsearch 的 Index management 可以查看 elk 生成的所有索引 (设置,Elasticsearch ,管理) 配 ...

  8. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  9. .net Aop 实现原理

    本文实现所有继承BaseModel的类都通过代理拦截 using System; using System.Reflection; using System.Collections.Generic; ...

  10. SSO实现机制

    引言 单点登录有许多开发商提供解决方案,本文以yale大学SSO开源项目CAS为例,介绍单点登录实现机制. 术语解释 SSO-Single Sign On,单点登录 TGT-Ticket Granti ...