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. 浅谈PageRank

    浅谈PageRank 2017-04-25 18:00:09 guoziqing506 阅读数 17873更多https://blog.csdn.net/guoziqing506/article/de ...

  2. mybatis批量新增或更新

    mysql中在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE时,向数据库中插入一条记录: 若插入数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作(UPDA ...

  3. distinct 数组去重,对象去重

    distinct 操作符可以用来去重,将上游重复的数据过滤掉. import { of } from 'rxjs'; import { distinct} from 'rxjs/operators'; ...

  4. 关于【vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据】的优化

    之前写的[vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据]这篇博客.功能虽然实现了相对应的功能.但是用起来很不爽.所以进行了优化. 备注:最近可能没时 ...

  5. 关于jQuery请求后台成功一直走error回调函数问题

    如果dataType声明与响应不符就会进入error回调.就算接口请求成功,也是走error回调函数.

  6. git merge合并分支; already up to date 现象, merger算法

    https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA% ...

  7. Docker下打包FastDFS镜像以及上传遇到的问题

    官方地址:https://github.com/happyfish100/fastdfs 一.先下载个包,然后解压(自己找个目录下载即可) [root@localhost soft]# wget ht ...

  8. matlab 双坐标折线图画法

    %%各时段电量需求 clc close all clear all cost_gd = [2200 1800 3800 4600]; cost_bj = [2.7 2.2 1.8 3.6]; cost ...

  9. 简单工厂(SimpleFactory)模式

    简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 简单工厂就是将多个if,else...代码 ...

  10. Django-11-Form组件

    1. 概述 Django的Form组件一般功能有: 验证用户输入 生成html代码 返回错误信息 创建Form类 from django.shortcuts import render, redire ...