BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为
0
Input
第一行输入N,M,K.接下来一行输入M位的数。 N<=10^9,M<=20,K<=1000
Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
Sample Input
111
Sample Output
解题思路:
首先,确定一下什么样的数字中没有不吉利数字。
1.这个数字的前缀不是不吉利数字(废话)
2.这个数字中间不包含不吉利数字(废话)
3.这个数字的后缀不是不吉利数字(废话)
那么,这个数字如果是像汉堡那样一层一层堆的话,我们可以通过尽可能阻止不吉利数字出现来完成任务。
假设数字串出现到了第 i 位,只要后缀m-1位不是不吉利数字m-1位就可以。
所以设f[i][j]为数字堆积到 i 而匹配出来了 j 位。
那么 :
a[k][j]为预处理出来的结果,其概念为:
原串中匹配到 j 时 k 位是否可以被枚举,由于做到不重不漏地计数,每次取前一个next即可
最后由于运算简单但递推长度大,使用矩阵乘法即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
int n,m;
lnt K;
char num[];
int nxt[];
struct squ{
lnt s[][];
squ friend operator * (squ x,squ y)
{
squ ans;
for(int i=;i<m;i++)
{
for(int j=;j<m;j++)
{
ans.s[i][j]=;
for(int k=;k<m;k++)
{
ans.s[i][j]=(ans.s[i][j]+x.s[i][k]*y.s[k][j])%K;
}
}
}
return ans;
}
squ friend operator ^ (squ x,lnt y)
{
squ ans=x;
y--;
while(y)
{
if(y&)
ans=ans*x;
x=x*x;
y=y/;
}
return ans;
}
}f,g;
int main()
{
scanf("%d%d%lld",&n,&m,&K);
scanf("%s",num+);
nxt[]=nxt[]=;
for(int i=,j=;i<=m;i++)
{
while(j&&num[i]!=num[j+])
j=nxt[j];
if(num[i]==num[j+])
j++;
nxt[i]=j;
}
for(int k=;k<m;k++)
{
for(int j=;j<;j++)
{
int i=k;
while(i&&num[i+]!=j+'')
i=nxt[i];
if(num[i+]==j+'')
i++;
if(i!=m)
g.s[i][k]=(g.s[i][k]+)%K;
}
}
f=g^n;
lnt ans=;
for(int i=;i<m;i++)
{
ans=(ans+f.s[i][])%K;
}
printf("%lld\n",ans);
return ;
}
BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)的更多相关文章
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
随机推荐
- Linux系统编程——进程间通信:信号中断处理
什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...
- php 扩展
如何利用PHP扩展函数,扩展出自己的函数等 php扩展函数有哪些zend_parse_parameters() spprintf() RETURN_STRINGL()
- Sqoop 的优势
1.sqoop可以高效的可控的利用资源,比如它可以通过调整任务数,来控制任务的并发度,另外还可以配置数据库的访问时间等等 2.sqoop能自动的完成数据类型的映射与转换 3.它支持多种数据库,比如my ...
- ajax处理错误(六)
使用ajax时必须留心两类错误,他们之间的区别源于视角不同. 一.第一类错误是从XMLHttpRequest对象的角度看到的问题:某些因素阻例如止了请求发送到服务器,例如DNS无法解析主机名,连接请求 ...
- BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- CSUOJ 1638 Continued Fraction
1638: Continued Fraction Time Limit: 1 Sec Memory Limit: 128 MB Description Input Output Sample Inp ...
- crm操作发票实体
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Cr ...
- Dynamics CRM 2015/2016 Web API:Unbound Custom Action 和 Bound Custom Action
今天我们再来看看Bound/Unbound Custom Action吧,什么是Custom Action?不知道的小伙伴们就out了,Dynamics CRM 2013就有了这个功能啦.和WhoAm ...
- MongoDB(六)java操作mongodb增删改查
java操作mysql数据库的代码我们已经了如指掌了.增删改查,java对mongodb数据库也是类似的操作,先是数据库连接.再是进行操作. 首先我们进入进入admin数据库.然后建立自己的数据库te ...
- jquery11源码 animate() : 运动的方法
{ var fxNow, timerId, rfxtypes = /^(?:toggle|show|hide)$/, rfxnum = new RegExp( "^(?:([+-])=|)( ...