[HNOI2008]GT考试(kmp,dp,矩阵乘法)
- Description
求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20)
- Solution
f[i][j]表示以数字串i位结尾有j个匹配的字符
g[i][j]表示从i个字符匹配到j个字符匹配的方案数
dp方程如下:
f[i][j]=f[i-1][k]*g[k][j] (0<=k<m)
发现g数组可以用kmp预处理出来,然后上矩阵乘法
- Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
using namespace std;
const int N=;
ll n,p,g[N][N],d[N][N],pre[N][N];
int m,nxt[N];
char s[N];
void mul1()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+g[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
g[i][j]=pre[i][j]%p;
}
void mul2()
{
memset(pre,,sizeof(pre));
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<m;k++)
pre[i][j]=(pre[i][j]+d[i][k]*g[k][j])%p;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
d[i][j]=pre[i][j]%p;
}
void ksm(ll x)
{
while(x)
{
if(x&) mul2();
mul1(),x>>=;
}
}
int main()
{
scanf("%lld%d%lld",&n,&m,&p);
scanf("%s",s+);
nxt[]=;
int k=;
for(int i=;s[i];i++)
{
while(k> && s[k+]!=s[i]) k=nxt[k];
if(s[k+]==s[i]) k++;
nxt[i]=k;
}
for(int i=;i<m;i++)
for(int j=;j<=;j++)
{
char wh=''+j;
int k=i;
while(k && s[k+]!=wh) k=nxt[k];
if(s[k+]==wh) k++;
if(k<m) g[i][k]++;
}
for(int i=;i<m;i++) d[i][i]=;
ksm(n);
ll ans=;
for(int i=;i<m;i++)
ans=(ans+d[][i])%p;
printf("%lld\n",ans%p);
return ;
}
[HNOI2008]GT考试(kmp,dp,矩阵乘法)的更多相关文章
- [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...
- 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2745 Solved: 1694[Submit][Statu ...
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
[BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...
- [BZOJ1009][HNOI2008]GT考试(KMP+DP)
[不稳定的传送门 Solution dp[i][j]表示前i个字符当前匹配到不吉利串的第j个,即当前方案的后缀等于不吉利串前缀 然而由于n过大,不能直接转移,用矩阵优化 Code #include & ...
- 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...
随机推荐
- 使用Glide加载圆角图片
//设置图片圆角角度 RoundedCorners roundedCorners= new RoundedCorners(6); //通过RequestOptions扩展功能,override采样率, ...
- CP防火墙备份与还原
Step1:进入专家模式 ====================================================== 如果没有设置专家模式的密码,执行下面命令进行设置: BJ-OFF ...
- 搭建高可用的flink JobManager HA
JobManager协调每个flink应用的部署,它负责执行定时任务和资源管理. 每一个Flink集群都有一个jobManager, 如果jobManager出现问题之后,将不能提交新的任务和运行新任 ...
- centos6.x将python2.6升级到2.7
一,安装开发工具和Python2.7(1)查看当前python版本 python -V Python 2.6.6 (2)下载Python-2.7.3 wget http://python.org/ft ...
- 基于FPGA的SPI FLASH控制器设计
1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- 性能数据的准备-Jmeter
性能测试的一般流程: 收集性能需求——>编写性能脚本——>执行性能测试——>分析测试报告——>系统性能调优 在收集性能需求后,我们会思考: 负载测试时并发时需要多少数据?例:登 ...
- JavaScript中函数式编程中文翻译
JavaScript 中的函数式编程 原著由 Dan Mantyla 编写 近几年来,随着 Haskell.Scala.Clojure 等学院派原生支持函数式编程的偏门语言越来越受到关注,同时主流的 ...
- Linux下搭建C/C++编程环境
Linux下搭建C/C++编程环境 1.KDevelop下载 wget -O KDevelop.AppImage https://download.kde.org/stable/kdevelop/5. ...
- schedule of 2016-09-26~2016-10-02(Monday~Sunday)——1st semester of 2nd Grade
2016/9/26 Monday 1.make ppt for this afternoon's group meeting 2.ask teacher Xiqi&Liu some probl ...