【以前的空间】bzoj1009 [HNOI2008]GT考试
动态规划+kmp+矩阵快速幂
关于这题可以写出一个dp方程(f[i,j]表示准考证前i位中后j位为不吉利的数字的前j位的情况的个数)
f[i,j]=Σf[i-1,k],其中j表示不吉利数字前k个数字加上某个数字后变成为不吉利数字的前j位(比如不吉利数字122123,然后现在k=5,那么如果填个3,j=6(123123);填个2,j=3(122);填个1,j=1(1);填个0,j=0。
然后我们就可以发现……好像可以用kmp算法来优化每次k+某个数字可以转移到的j的位置……因为j包括了前k个数字,那么j一定是在k的失配函数+1位或者不存在。
但是这样的话时间复杂度依然因为n过大而报表……。
于是神奇的矩阵来了!
没有发现似乎式子是递推式么?!
也就是F(n)是可以通过F(n-1)得到的!F(n)表示f[n,0],f[n,1],f[n,2]……f[n,m-1]的集合,或者说……一个1*(m-1)的矩阵。
矩阵的定义白书有句话说的特别好:“把一个向量v变成另一个向量v',并且v'的每个分量都是v各个分量的线性组合”。什么是线性组合……就是一个线性方程组!对于这题来说,线性方程组就是:
F(n)=A*F(n-1) (这里A叫友矩阵,其实就是转移关系)
如果写出矩阵,式子就变成
[f(n,0) ] [a[0,0] ,a[1,0] ,a[2,0] ,……,a[m-1,0] ] [f(n-1,0) ]
[f(n,1) ] [a[0,1] ,a[1,1] ,a[2,1] ,……,a[m-1,1] ] [f(n-1,1) ]
[f(n,2) ] = [a[0,2] ,a[1,2] ,a[2,2] ,……,a[m-1,2] ] * [f(n-1,2) ]
[ …… ] [ …… ] [ …… ]
[f(n,m-1)] [a[m-1,1],a[m-1,2],a[m-1,3],……,a[m-1,m-1]] [f(n-1,m-1)]
式子中的a[i,j]表示不吉利数字前i位加上某个数字后可以转的j位的数量。
前面说的线性组合是什么意思?矩阵其实是一个线性方程组,形式就是:
a[0,0]*f[n-1,0]+a[1,0]*f(n-1,1)+a[2,0]*f(n-1,2)+……+a[m-1,0]*f[n-1,m-1]=f[n,0];
a[0,1]*f[n-1,0]+a[1,1]*f(n-1,1)+a[2,1]*f(n-1,2)+……+a[m-1,1]*f[n-1,m-1]=f[n,1];
a[0,2]*f[n-1,0]+a[1,2]*f(n-1,1)+a[2,2]*f(n-1,2)+……+a[m-1,2]*f[n-1,m-1]=f[n,2];
…………………………………………………
a[0,m-1]*f[n-1,0]+a[1,m-1]*f(n-1,1)+a[2,m-1]*f(n-1,2)+……+a[m-1,m-1]*f[n-1,m-1]=f[n,m-1]
看出来了么?
回到题目上,如果递推算F(n),显然不行,但是我们有一个递推式F(n)=A*F(n-1),它可以化为F(n)=A^n*F(0)。
那么现在要做的就是如何优化A^n,想到快速幂?是的,矩阵也有快速幂(具体到网上找吧,这就不是理解方面的了)
然后答案就是F(n)=A^n*F(0)。但是这个F(0)没什么意义啊,f[0,0]=1,其他都等于0。
这样像上面那样写出线性方程组的形式你就发现这个F(n)=a[0,0]+a[0,1]+a[0,2]+……+a[0,m-1],那最后就没有必要算F(0)*A^n,直接算上a[0,i]的和就行了!
然后联系一下A的意义……是不是有点感觉?A^i就是表示a[j,k]原来是前j位递推i次后能变成前k位的方案!蒟蒻感觉好神奇!
然后就好像初步学会了矩阵快速幂优化……
type
arr=array[..,..]of longint; var
a,c,tmp:arr;
b,p:array[..]of longint;
i,j,k,l,n,m,mm,sum:longint;
ch:char; procedure mul(var x,y:arr);
var
i,j,k:longint;
begin
for i:= to m- do
for j:= to m- do begin
tmp[i,j]:=;
for k:= to m- do
tmp[i,j]:=(tmp[i,j]+x[i,k]*y[k,j])mod mm;
end;
for i:= to m- do
for j:= to m- do
x[i,j]:=tmp[i,j];
end; begin
readln(n,m,mm);
for i:= to m do begin
read(ch);
b[i]:=ord(ch)-ord('');
end;
j:=;
p[]:=;
for i:= to m do begin
while (j>) and (b[j+]<>b[i]) do j:=p[j];
if b[j+]=b[i] then inc(j);
p[i]:=j;
end;
for i:= to m- do
for j:= to do begin
k:=i;
while (k>) and (b[k+]<>j) do k:=p[k];
if b[k+]=j then inc(k);
if k<>m then c[i,k]:=(c[i,k]+)mod mm;
end;
fillchar(a,sizeof(a),);
for i:= to m- do
a[i,i]:=;
while n> do begin
if n and = then mul(a,c);
mul(c,c);
n:=n>>;
end;
sum:=;
for i:= to m- do
sum:=(sum+a[,i]) mod mm;
writeln(sum);
readln;
readln;
end.
【以前的空间】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 ...
随机推荐
- 算法------------数组----------------两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
- php webservice 可能存在的坑
场景: 今天在生产机器上调用webservice失败 报 ...failed to load external entity... wget一下地址发现报500错误 把wsdl去掉再wget 发现就 ...
- ServletContext详解 以及用法
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所 ...
- K8S全栈容器服务如何助力企业云化创新?
容器编排管理平台Kubernetes在实践两年多后,市场主导地位被正式确定,随着首批认证服务商的宣布,围绕着容器的应用编排部署服务已然成熟,Kubernetes开始在商业场景为企业创造价值.华为云在K ...
- Web自动化selenium技术快速实现爬虫
selenium是大家众所周知的web自动化测试框架,主要用来完成web网站项目的自动化测试,但其实如果要实现一个web爬虫,去某些网站爬取数据,其实用selenium来实现也很方便. 比如,我们现在 ...
- Vue 编程之路(二)——跳转页面传值
最近公司的一个项目中使用 Vue 2.0 + element UI 实现一个后台管理系统的前端部分,属于商城类型.其中我负责的部分有一项需要跳转页面,由于跳转前的页面是多个组件构成的,所以在跳转页面的 ...
- lintcode172 删除元素
删除元素 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...
- Java基础知识:Java实现Map集合二级联动3
* Returns an image stored in the file at the specified path * @param path String The path to the ima ...
- [C++ map & dp]codeforces 960F. Pathwalks
题目传送门:960F 思路: 题目给人的感觉很像最长上升子序列,自然而然想到用dp的思路去处理 题目中给的限制条件是,要接上前面的边,前面的边权一定要小于当前的边权(题目按照输入的顺序,因此只找前面的 ...
- 2.重新安装CM服务
步骤1.停止CM服务2.删除CM服务3.添加CM服务4.测试数据库 步骤 1.停止CM服务 2.删除CM服务 没有发现可以单独删除某一项CM服务,必须全部删除 3.添加CM服务 4.测试数据库 如果报 ...