[HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]
题面
思路
首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法:
设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数
那么显然,答案就是$\sum_{i=0}^{m-1}dp[n][i]$了
转移过程则需要用一个辅助数组:令$g[i][j]$表示模板串的前缀$i$可以转移到前缀$j$的方法数(注意它可能可以转移到很多个串)
辅助数组的生成可以用next数组来推(模板串太短,其实暴力也是可以的)
那么$dp[i+1][k]=dp[i][j]*g[j][k]\left(j=1...m\right)$
然后再看这题的数据范围:$n\leq 10^9$
Easy,加一个矩阵快速幂来解决上面的递推就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 1e9
using namespace std;
int MOD;
struct ma{//矩阵类
int n,m,a[25][25];
ma(){n=m=0;memset(a,0,sizeof(a));}
void clear(){n=m=0;memset(a,0,sizeof(a));}
}A,B;
void mul(ma &a,ma b){//矩阵乘法
ma re;int i,j,k;re.n=a.n;re.m=b.m;
for(i=0;i<=re.n;i++){
for(k=0;k<=a.m;k++){
if(!a.a[i][k]) continue;
for(j=0;j<=re.m;j++){
re.a[i][j]=(re.a[i][j]+a.a[i][k]*b.a[k][j]%MOD)%MOD;
}
}
}
a=re;
}
int n,m,a[30],fail[30],f[30][10];char s[30];
void qpow(ma &x,ma &y,int t){//快速幂
while(t){
if(t&1) mul(x,y);
mul(y,y);t>>=1;
}
}
int main(){
scanf("%d%d%d",&m,&n,&MOD);
scanf("%s",s);int i,j,k;
for(i=0;i<n;i++) a[i]=s[i]-'0';a[n]=inf;
fail[0]=fail[1]=0;j=0;
for(i=1;i<n;i++){//求出next数组
while(j&&(a[i]!=a[j])) j=fail[j];
j+=(a[i]==a[j]);fail[i+1]=j;
}
for(i=0;i<n;i++){//生成转移矩阵
for(j=0;j<10;j++){
k=i;while(k&&a[k]!=j) k=fail[k];
k+=(a[k]==j);
if(k<n) B.a[i][k]+=1;
}
}
B.m=B.n=A.m=n-1;A.n=0;A.a[0][0]=1;
qpow(A,B,m);
int ans=0;
for(i=0;i<n;i++) ans+=A.a[0][i],ans%=MOD;
printf("%d",ans);
}
[HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]的更多相关文章
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- [HNOI2008] GT考试(DP+矩阵快速幂+KMP)
题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ...
- bzoj1009 GT考试 (kmp+矩阵优化dp)
设f[i][j]是到第i位 已经匹配上了j位的状态数 然后通过枚举下一位放0~9,可以用kmp处理出一个转移的矩阵 然后就可以矩阵快速幂了 #include<bits/stdc++.h> ...
- LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)
题意:给出一个字符集和一个字符串和正整数n,问由给定字符集组成的所有长度为n的串中不以给定字符串为连续子串的有多少个? 析:n 实在是太大了,如果小的话,就可以用动态规划做了,所以只能用矩阵快速幂来做 ...
- 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...
随机推荐
- Zend Studio 12.5.1原版安装破解
安装官方Zend Studio 12.5.1原版,关闭zend studio,然后将破解补丁com.zend.verifier_12.5.1.v20150514-2003.jar覆盖到 安装目录\pl ...
- python_20_列表
#1 names=["QiZhiguang","DaiYang","HuZhongtao","ZhangDong"] p ...
- 私人定制,十款最佳Node.js MVC框架
Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaScript中最为流行的框架之一,易于创建可 ...
- 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 FTP 服务器
我们经常会使用 FTP,把本地电脑上的文件上传到服务器上,或者把服务器上的文件下载到自己的电脑里面.FTP 有服务端和客户端,FTP 的服务端提供了这种传输文件的服务,FTP 的客户端提供了传输文件的 ...
- C#的接口基础教程之六 接口转换
C#中不仅支持.Net 平台,而且支持COM平台.为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性.一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息.属性使 C# 能够支 ...
- z-index、absolute、marquee滚动条的问题
1.z-index 层次叠加 ,元素叠加,谁的权重大谁就在上面 1).父级出现position:relation:的时候,失效: 2).层叠元素出现float的时候失效: 3).层次元素也得设置pos ...
- gitlab系列详解
虚拟机的安装1.安装virtualboxhttps://www.virtualbox.org/2.安装centos6.63.配置网络右键-->网络-->网卡2-->host-only ...
- 高性能可扩展MySQL数据库设计及架构优化 电商项目(慕课)第3章 MySQL执行计划(explain)分析
ID:相同就从上而下,不同数字越大越优先
- Vue项目中遇到的一些问题总结
一.开发环境使用Ajax请求,报错 网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...
- position的 relative+absolute实现固定标签在窗口的某个位置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...