[Bzoj1009][HNOI2008]GT考试(动态规划)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1009
显而易见的动态规划加矩阵快速幂,不过转移方程不怎么好想,dp[i][j]表示长度为i的准考证号后j位与不吉利数字的前j位相同的方案数。则:
转移方程为$dp[i][j]=\sum_{k=0}^{m-1}dp[i-1][k]*g[k][j]$
答案为:$ans=\sum_{i=0}^{m}dp[n][i]$
g[i][j]表示长度为i的后缀变成长度为j的后缀的方案数。
而g数组可以用kmp预处理出来
附上洛谷40分不用矩阵优化的代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 6e6 + ;
ll Next[];
ll g[][];
ll dp[maxn][];
char s[];
void getN(int n) {
Next[] = -;
int i = , j = -;
while (i < n) {
if (j == - || s[i] == s[j])
Next[++i] = ++j;
else
j = Next[j];
}
}
int main() {
ll n, m, mod;
scanf("%lld%lld%lld", &n, &m, &mod);
scanf("%s", s);
getN(m);
Next[] = ;
for (int i = ; i < m; i++) {
for (int j = ''; j <= ''; j++) {
int t = i;
while (t&& s[t] != j)
t = Next[t];
if (s[t] == j)
t++;
g[i][t]++;
}
}
dp[][] = ;
for (int i = ; i <= n; i++) {
for (int j = ; j < m; j++) {
for (int k = ; k < m; k++) {
dp[i][j] = (dp[i][j] + dp[i - ][k] * g[k][j]) % mod;
}
}
}
ll ans = ;
for (int i = ; i < m; i++)
ans = (ans + dp[n][i]) % mod;
printf("%lld\n", ans);
}
以及正解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 6e6 + ;
ll Next[];
ll n, m, mod;
ll dp[][];
char s[];
void getN(int n) {
Next[] = -;
int i = , j = -;
while (i < n) {
if (j == - || s[i] == s[j])
Next[++i] = ++j;
else
j = Next[j];
}
}
struct matrix {
ll cnt[][];
matrix() { memset(cnt, , sizeof(cnt)); }
matrix operator *(const matrix a)const {
matrix ans;
for (int i = ; i <= m; i++) {
for (int j = ; j <= m; j++) {
ans.cnt[i][j] = ;
for (int k = ; k <= m; k++)
ans.cnt[i][j] = (ans.cnt[i][j] + cnt[i][k] * a.cnt[k][j]) % mod;
}
}
return ans;
}
};
matrix powM(matrix a, int b) {
matrix ans = matrix();
for (int i = ; i <= m; i++)
ans.cnt[i][i] = ;
while (b) {
if (b & )
ans = ans * a;
a = a * a;
b /= ;
}
return ans;
}
int main() {
matrix g, ans, dp = matrix();
scanf("%lld%lld%lld", &n, &m, &mod);
scanf("%s", s);
getN(m);
Next[] = ;
memset(g.cnt, , sizeof(g.cnt));
for (int i = ; i < m; i++) {
for (int j = ''; j <= ''; j++) {
int t = i;
while (t&& s[t] != j)
t = Next[t];
if (s[t] == j)
t++;
g.cnt[i][t]++;
}
}
dp.cnt[][] = ;
ans = powM(g, n);
ans = dp * ans;
ll sum = ;
for (int i = ; i < m; i++)
sum = (sum + ans.cnt[][i]) % mod;
printf("%lld\n", sum);
}
[Bzoj1009][HNOI2008]GT考试(动态规划)的更多相关文章
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...
- bzoj1009 [HNOI2008] GT考试 矩阵乘法+dp+kmp
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4542 Solved: 2815[Submit][Statu ...
- [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4309 Solved: 2640[Submit][Statu ...
- bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)
1009: [HNOI2008]GT考试 题目:传送门 题解: 看这第一眼是不是瞬间想起组合数学??? 没错...这样想你就GG了! 其实这是一道稍有隐藏的矩阵乘法,好题! 首先我们可以简化一下题意: ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- [bzoj1009][HNOI2008]GT考试
Description 阿申准备报名参加考试,准考证号为位数,他不希望准考证号上出现不吉利的数字. 他的不吉利数学有位,不出现是指中没有恰好一段等于. 可以为. Input 第一行输入.接下来一行输入 ...
- [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂
https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9 ...
随机推荐
- JVM Heap Memory和Native Memory
JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory.前者我们比较熟悉,是供Java应用程序使用的:后者也称为C-Heap,是供JVM自身进程使用的.Heap Me ...
- 采用pacemaker+corosync实现postgresql双机热备、高可用方案
环境说明 参照上章已完成postgresql流复制配置,并关闭postgres服务. su - postgres pg_ctl -D /data/postgresql/data/ stop -m fa ...
- 实验查看PHP本地的Session信息
通过Nginx调度器负载后端两台Web服务器,实现以下目标: - 部署Nginx为前台调度服务器 - 调度算法设置为轮询 - 后端为两台LNMP服务器 - 部署测试页面,查看PHP本地的Session ...
- amqp 抓包 不要在同一台机器
- Redis复制实现原理
摘要 我的前一篇文章<Redis 复制原理及特性>已经介绍了Redis复制相关特性,这篇文章主要在理解Redis复制相关源码的基础之上介绍Redis复制的实现原理. Redis复制实现原理 ...
- Redis安装配置以及开机启动
1.下载源码,解压缩后编译源码. $ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ .tar.gz $ cd redis- ...
- 类数组对象与 arguments
类数组对象:拥有一个 length 属性和若干索引属性的对象 var array = ['name', 'age', 'sex']; var arrayLike = { 0: 'name', 1: ' ...
- Windows环境下使用Mycat模拟分库分表-读写分离案例
一.基本环境 W7 64位.Mycat1.6.MySQL8.0 二.Mycat核心配置文件配置 解压Mycat1.6,并对server.xml.schema.xml.rule.xml三个核心配置文件做 ...
- php Closure类 闭包 匿名函数
php匿名函数 匿名函数就是没有名称的函数.匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调. 如: ...
- scrapy中的cookies参数详解
COOKIES_ENABLED 默认: True 是否启用cookiesmiddleware.如果关闭,cookies将不会发送给web server. COOKIES_DEBUG 默认: False ...