[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调查了市民的需求,决定按下述规则设计 ...
随机推荐
- Channel 9视频整理【3】
Will 保哥 微软mvp https://channel9.msdn.com/Niners/Will_Huang 繁体中文视频 Visual Studio 2017 新功能探索 https://ch ...
- AbstactFactory模式
AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象. AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteF ...
- python类中的一些神奇方法
__str__:用于在print(对象)时,直接打印__str__的返回值 class Animal: def __init__(self, name): self.name = name def _ ...
- scrapy分布式Spider源码分析及实现过程
分布式框架scrapy_redis实现了一套完整的组件,其中也实现了spider,RedisSpider是在继承原scrapy的Spider的基础上略有改动,初始URL不在从start_urls列表中 ...
- 0010 CSS字体样式属性:font-size、font-family、Unicode字体、font-weight、font-style、综合设置、color、 text-align、line-height、text-indent、text-decoration、、、
CSS字体样式属性.调试工具 目标 应用 使用css字体样式完成对字体的设置 使用css外观属性给页面元素添加样式 使用常用的emment语法 能够使用开发人员工具代码调试 1.font字体 1.1 ...
- CSV 文件的存取
CSV 文件介绍 CSV(Comma-Separated Values),中文通常叫做逗号分割值.CSV文件由任意数目的记录(行)组成,每条记录由一些字段(列)组成,字段之间通常以逗号分割,当然也可以 ...
- jenkins+ant+jmeter自动化环境搭建
jmeter:测试接口的工具,支持java语言: ant:Apache Ant是一个Java库和命令行工具,其任务是将构建文件中描述的进程作为相互依赖的目标和扩展点.只要使用过Linux系统的读者,应 ...
- spring cloud 微服务之 -- 配置文件拆分之道
0-前言 在spring cloud微服务架构中,基本上每个拆分的微服务都会部署多个运行实例,这些运行实例,配置基本都是一样的,不同的是少数配置,比如端口,而这些不同的配置又是必不可少的 那我们怎么来 ...
- 利用自编码(Autoencoder)来提取输入数据的特征
自编码(Autoencoder)介绍 Autoencoder是一种无监督的学习算法,将输入信息进行压缩,提取出数据中最具代表性的信息.其目的是在保证重要特征不丢失的情况下,降低输入信息的维度,减小神经 ...
- Ceph 文件系统 CephFS 的实战配置,等你来学习 -- <4>
Ceph 文件系统 CephFS 的介绍与配置 CephFs介绍 Ceph File System (CephFS) 是与 POSIX 标准兼容的文件系统, 能够提供对 Ceph 存储集群上的文件访问 ...