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 ...
随机推荐
- Qt Qwdget 汽车仪表知识点拆解1 速度表示
先贴上效果图,注意,没有写逻辑,所以这些都是乱动的 这里线主要说一下中间显示速度的显示制作的方式,在这里,自己专门写了一个数字的仪表 考虑的一般的汽车是没有办法把瞬时速度提升到四位数的,所以我这里就放 ...
- 12-Mysql数据库----多表查询
本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, ...
- 并查集——poj2524(入门)
传送门:Ubiquitous Religions 许多次WA,贴上错的代码随时警示 简单没多加修饰的并查集 [WA1] #include <iostream> #include <c ...
- webmagic 二次开发爬虫 爬取网站图片
webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. webmagic介绍 编写一个简单的爬虫 webmagic的使用文档:http://w ...
- STL中list的erase()方法
http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点 但是要注意的是在执行完此函数的时候iterator也被销毁了 这样的话关于it ...
- QThread中的互斥、读写锁、信号量、条件变量
该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78431 在gemfield的<从pthread到QThread>一文中我们了解了线 ...
- redis集群如何清理前缀相同的key
最近经常收到redis集群告警,每天收到50多封邮件,实在不胜其烦,内存不够用,原因是有一些无用的key(约3000万)占用内存(具体不说了).这部分内存不能被释放. 原来的定期清理脚本的逻辑: 打开 ...
- iMuseum
iMuseum 每日环球展览 iMuseum https://itunes.apple.com/cn/app/%E6%AF%8F%E6%97%A5%E7%8E%AF%E7%90%83%E5%B1%95 ...
- [Java] 各种常用函数
1.writeInt()和readInt() 这两个函数并不是写入一个整数,读取一个整数.它们实际上是写入4个字节,读取4个字节. writeInt(int i)把i按四个字节,二进制形式写到输出流里 ...
- CKEditor的基本使用
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <% ...