题目链接:https://www.luogu.org/problemnew/show/P3193#sub

题目描述

阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= Xi <= 9) ,他不希望准考证号上出现不吉利的数字。 他的不吉利数学 A1​,A2​…Am​(0≤Ai​≤9) 有 M 位,不出现是指 X1​,X2​…Xn​ 中没有恰好一段等于 A1​,A2​…Am​ ,A1​

输入输出格式

输入格式:

第一行输入N,M,K.接下来一行输入M位的数。

输出格式:

阿申想知道不出现不吉利数字的号码有多少种,输出模 K 取余的结果。

输入输出样例

输入样例#1:

4 3 100
111
输出样例#1:

81

说明

N≤109,M≤20,K≤1000

题目大意,给定长为m的子串,统计长度为n的不包含该子串的串的方案数

考虑DP解决,f[i][j]表示长串匹配到第 i 位,短串最多可以匹配到第 j 位的方案数(即表示长度为i的长串,最后j个可以匹配短串前j位的方案数)

状态转移方程如下:

f[i+1][j]=f[i][k]*g[j][k](0<=k<m)

最终答案就是∑f[n][i](0<=i<m)(这显然正确,仔细想想就发现这些i代表的状态互相独立,且并集包含了所有的状态)

g[i][j]表示对于短串,原本匹配了i位,匹配下一位时匹配到第j位的这个下一位的方案数

图一,短串匹配了j位,长串匹配到了i位

图2,长串继续向下匹配,短串失配

图3,短串转移到下一个可以匹配的地方

注意由于new是我们任意填的,因此我们只需考虑短串的下一个匹配的位置,即KMP算法中的next数组

上面三幅图实际上就是匹配的过程,是为了让读者更好的理解g数组的含义

下面我们考虑怎么求g数组。回顾g数组的含义,我们发现实际上只和短串有关(上面说了,new是任意填的)。KMP预处理出g数组,若我原来匹配了i位,枚举下一个数字,不断转移next数组直到匹配成功,最终得到一个可以匹配的位置k,然后我们让f[i][k]++统计方案数

发现n的取值过大且上述状态转移方程可用矩阵快速幂优化。注意每次乘上转移矩阵得到的矩阵存储的实际上是状态,因此其实矩阵的宽都是1来着。

考虑到每次我们转移的矩阵g是不变的,于是我们可以很快结束这个问题

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; const int N=;
int n,m,mod;
int next[N],a[N];
char s[N];
struct matrix
{
int r,c,num[N][N];//矩阵的长宽
matrix(){memset(num,,sizeof(num));}
void init()
{
for (int i=;i<N;i++)
num[i][i]=;
}
}g,A;
matrix mul(matrix a,matrix b)
{
matrix ans;
ans.r=a.r;ans.c=b.c;
for (int i=;i<=a.r;i++)
for (int j=;j<=b.c;j++)
{
ans.num[i][j]=;
for (int k=;k<=ans.c;k++)
ans.num[i][j]=(ans.num[i][j]+a.num[i][k]*b.num[k][j])%mod;
}
return ans;
}
matrix qpow(matrix a,int x)
{
matrix ans;
ans.init();
for (;x;x>>=,a=mul(a,a)) if (x&) ans=mul(ans,a);
return ans;
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
scanf("%s",s);
for (int i=;i<m;i++) a[i]=s[i]-'';a[m]=0x3f3f3f3f;
for (int i=,j=;i<m;i++)//计算出next数组
{
while (j&&(a[i]!=a[j])) j=next[j];
j+=(a[i]==a[j]);
next[i+]=j;
}
for (int i=;i<m;i++)
for (int j=;j<;j++)//预处理出g数组
{
int k=i;
while (k&&a[k]!=j) k=next[k];
k+=(a[k]==j);
if (k<m) g.num[i][k]++;//i位可以转移到k位
}
A.num[][]=;A.r=;g.c=g.r=A.c=m-;//初始化
A=mul(A,qpow(g,n));
int ans=;
for (int i=;i<m;i++) {ans+=A.num[][i];ans%=mod;}//统计每个状态的答案
printf("%d",ans);
return ;
}

[HNOI2008] GT考试(DP+矩阵快速幂+KMP)的更多相关文章

  1. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  2. [BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那 ...

  3. 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...

  4. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  5. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  6. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  7. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  8. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  9. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

随机推荐

  1. 怎样更好的深入学习andorid

    把主要的控件  基本布局 基本组件  数据存储都熟悉一边,在看网络的时候,有点不知道怎么搞了.由于一直用c开发,但接触socket也不多,这两天把java的socket编程熟悉了下.找了非常多书,可是 ...

  2. POJ 2296 Map Labeler(2-sat)

    POJ 2296 Map Labeler 题目链接 题意: 坐标轴上有N个点.要在每一个点上贴一个正方形,这个正方形的横竖边分别和x,y轴平行,而且要使得点要么在正方形的上面那条边的中点,或者在以下那 ...

  3. 1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise

    题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B Given any permutation of t ...

  4. apiCloud中实现头部与内容分离与操作规范,App头部header固定,头部与内容分离

    官方案例 1.头部拆分成一个页面比如news-text <!doctype html> <html> <head> <meta charset="u ...

  5. [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)

    题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...

  6. [JZOJ 5875] [NOIP2018提高组模拟9.20] 听我说,海蜗牛 解题报告(BFS+二分)

    题目链接: http://172.16.0.132/senior/#main/show/5875 题目: 题解: 注意这题只能经过开放的港口 我们考虑用vector存下每个点不能到的点,并把并让vec ...

  7. VMware虚拟机的CentOS7安装Nginx后本机用CentOS的IP地址无法访问

    因为CentOS7的默认防火墙改成了Firewall,不再使用iptables为默认防火墙了 所以需要使用以下命令添加80端口 firewall-cmd --zone=public --add-por ...

  8. js调节图片的亮度

    js调节图片的亮度:(使用CSS3的滤镜) 1.实现点亮图标.熄灭图标的效果 效果图: 页面代码: <!DOCTYPE html> <%@ page language="j ...

  9. Android ViewPager 动画效果

    找到个不错的开源项目:https://github.com/jfeinstein10/JazzyViewPager Android ViewPager 动画效果   

  10. 3ds Max灯光教程之卧室灯光布局实例

    对于设计师来说要做好一张好的作品效果图包括很多比如:“造型.色彩搭配.灯光气氛.构图角度等等,上次给大家详细的分析了下产品渲染中摄像机的构图及原理.本期教程来跟大家讨论一下max场景灯光布局问题.以卧 ...