bzoj 1009 DP+矩阵加速
我们用DP来解决这个问题
W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成
当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数
那么我们最后的ans=ΣW[N,I] 0<=I<=M-1
那么我们考虑怎么转移
假设当前到第I位了,匹配到第J位,也就是W[I,J]的值我们有了,我们可以枚举第I+1位是什么,
然后通过KMP的NEXT数组可以快速的得到当前枚举的位可以匹配到第几位,假设可以匹配到第P位,
那么我们W[I+1,P]+=W[I,J],这样就可以转移了
但是我们看N的数据范围是10^9,所以递推是完不成的,这时候需要观察下规律
我们发现转移时的P,J和I是没有关系的,也就是不管I是几,W[I,J]固定会加到W[I+1,K]上
所以我们换一种转移的方式,之前是用W[I,J]更新W[I+1,P],现在我们可以写成
W[I,J]=a0*W[I-1,0]+a1*W[I-1,1]+......+a(m-1)*W[I-1,M-1]
而且ai数组是不变的,那么这个式子就是常系数线性齐次递推式(新买的书上把这个式子叫这个。。),
然后我们可以用矩阵乘法加速,在log级别中求出ans
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
type
rec =array[..,..] of longint;
var
s :ansistring;
pre :array[..] of longint;
n, m, d39 :longint;
sum, ans :rec;
cur :longint;
procedure init;
var
i, j, k :longint;
c :ansistring;
begin
readln(n,m,d39);
readln(s);
j:=;
for i:= to m do
begin
while (s[i]<>s[j+]) and (j<>) do j:=pre[j];
if s[i]=s[j+] then
begin
inc(j);
pre[i]:=j;
end;
end;
for i:= to m- do
for j:= to do
begin
str(j,c);
k:=i;
while (s[k+]<>c) and (k<>) do k:=pre[k];
if s[k+]=c then inc(k);
inc(sum[i,k]);
end;
end;
function mul(a,b:rec):rec;
var
i, j, l :longint;
begin
fillchar(mul,sizeof(mul),);
for i:= to m- do
for j:= to m- do
for l:= to m- do mul[i,j]:=(mul[i,j]+a[i,l]*b[l,j]) mod d39;
end;
procedure main;
var
p :longint;
i :longint;
begin
for i:= to m do ans[i,i]:=;
p:=n;
while p<> do
begin
if p mod = then ans:=mul(ans,sum);
p:=p div ;
sum:=mul(sum,sum);
end;
for i:= to m- do cur:=(cur+ans[,i]) mod d39;
writeln(cur);
end;
begin
init;
main;
end.
bzoj 1009 DP+矩阵加速的更多相关文章
- bzoj 1009 DP 矩阵优化
原来的DP: dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀. 转移: i==0 dp[0][0] = 1 dp[0][1~m-1] = 0 i>=1 dp ...
- bzoj 4037: [HAOI2015]数字串拆分【dp+矩阵加速】
首先f长得就很像能矩阵优化的,先构造转移矩阵(这里有一点神奇的地方,我看网上的blog和我构造的矩阵完全不一样还以为我的构造能力又丧失了,后来惊奇的发现我把那篇blog里的构造矩阵部分换成我的构造方式 ...
- HDU 5564 Clarke and digits 状压dp+矩阵加速
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...
- Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks dp+矩阵加速
题目链接: http://codeforces.com/problemset/problem/621/E E. Wet Shark and Blocks time limit per test2 se ...
- P5343 【XR-1】分块(dp矩阵加速)
\(大意是用数组a里的数字,组成一个序列,使得序列和为n的方案种数\)传送门 \(先考虑dp.\) \(但是不能直接用背包转移,因为是序列,要考虑顺序.\) \(所以,为了去重,我们令dp[i][j] ...
- bzoj2004公交线路——DP+矩阵加速递推
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...
- [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...
- BZOJ 1875(DP+矩阵快速幂)
题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...
- AC日记——[HNOI2008]GT考试 bzoj 1009
1009 思路: KMP上走DP(矩阵加速): DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数: 代码: #include <bits/stdc++.h> using ...
随机推荐
- 【jQuery】 js 对象
[jQuery] js 对象 一. 创建对象的三种方式 <script> var v1 = new Object(); v1.name = "name1"; v1.a ...
- Java Web前后端分离的思考与实践
第一节 Java Web开发方式的变化 Web开发虽然是我们常说的B/S模式,其实本质上也是一种特殊的C/S模式,只不过C和S的选择余地相对要窄了不少,而且更标准化.不论是采用什么浏览器和后端框架,W ...
- 关于相对布局RelativeLayout的各种属性介绍
RelativeLayout相对布局是个人觉得在android布局中比较常用且好用的一个,当然如果想让布局更漂亮是需要多种布局混合搭建的,这里就需要更深入的学习了,在这只介绍下有关相对布局的东西. 相 ...
- 汇编指令MOVSX与MOVZX
MOVSX 操作数A ,操作数B MOVZX 操作数A ,操作数B 相同点:操作数B 空间必须小于 操作数A 1.格式与MOV基本相同 2.能完成小存储单元向大存储单元的数据传送 比如 movsx e ...
- 第一篇 Charles的配置及相关使用
// Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用. Registered Na ...
- Django源码分析之执行入口
魔法门 一般我们启动django,最简单的方法是进入project 目录,这时目录结构是这样的 然后我们执行python manage.py runserver,程序就开始执行了. 那django是如 ...
- 寻找完全数(C++)
[问题描述] 输入一个大于 1 的正整数 n,请你将大于 1 和小于或等于 n 的所有完全数输出.所谓完全数就是因子(不算其本身)之和等于它本身的数.例如 1+2+4+7+14=28,所以 28 是完 ...
- python基础训练营02
任务二 时长:2天 1. 列表 a. 标志 b. 基本操作(创建,append( ),pop( ) ,del( ), 拷贝) c. 列表相关方法 2. 元组 a. 标志 b. 基本操作(创建及不可变性 ...
- 官方文档 恢复备份指南八 RMAN Backup Concepts
本章内容 Consistent and Inconsistent RMAN Backups Online Backups and Backup Mode Backup Sets Image Copie ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...