【BZOJ1009】【HNOI2008】GT考试
依旧看人代码写,不过我觉得自己慢慢写一个也可以写成?
原题:
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为
0
N<=10^9,M<=20,K<=1000
一开始完全是懵逼的,后来找到两个解释结合一下就理解了
用a(i,j)表示原串走到i,不吉利的串走到j的方案数
设一个数组b(i,j),表示从(i,j)转移到(i+1,k)的方案数,这个可以用kmp处理,先kmp出next,然后枚举i和j,根据kmp求出k并将b(i+1,k)++
然后这个b表示的就是a中的元素下一步会贡献到哪里
这个东西比较玄,只能勉强意会……
NOIP吧里有一种解释,虽然写法似乎和我的不太一样,引导思路效果不错:
“构造转移矩阵A和列向量B,B=(f[0][0],f[0][1],...,f[0][m]),A可以由DP得到,那么A*B的结果就是(f[1][0],f[1][1],...,f[1][m]),所以A^n*B的结果就是(f[n][0],f[n][1],...,f[n][m])”
然后矩阵快速乘即可
小技巧:使用a&1判断奇偶
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,mo,s[];
int next[];
int b[][],a[][],c[][];
int ans=;
void kmp(){
int temp=; next[]=;
for(int i=;i<=m;i++){
while(temp && s[temp+]!=s[i]) temp=next[temp];
if(s[temp+]==s[i]) temp++;
next[i]=temp;
}
}
void get_b(){
int temp;
for(int i=;i<m;i++){//注意j枚举的是下一位,因为这里j是对下一位的转移,所以矩阵乘法从0开始写,比较方便
a[i][i]=;
for(int j=;j<=;j++){
temp=i;
while(temp && s[temp+]!=j) temp=next[temp];
if(j==s[temp+]) b[i][temp+]+=;
else b[i][]+=;
}
}
}
void fast_mi(){
while(n){
if(n&){//快速判断奇偶
for(int i=;i<m;i++)
for(int j=;j<m;j++){
c[i][j]=;//反正也要枚举,就不用memset了
for(int k=;k<m;k++)
c[i][j]=(c[i][j]+b[i][k]*a[k][j])%mo;
}
for(int i=;i<m;i++)
for(int j=;j<m;j++)
a[i][j]=c[i][j];
}
n>>=;
for(int i=;i<m;i++)
for(int j=;j<m;j++){
c[i][j]=;
for(int k=;k<m;k++)
c[i][j]=(c[i][j]+b[i][k]*b[k][j])%mo;
}
for(int i=;i<m;i++)
for(int j=;j<m;j++)
b[i][j]=c[i][j];
/*for(int i=0;i<m;i++){
for(int j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}*/
}
}
int main(){//freopen("ddd.in","r",stdin);
memset(b,,sizeof(b));
cin>>n>>m>>mo;
for(int i=;i<=m;i++){
scanf("%c",&s[i]); while(s[i]<''||s[i]>'') scanf("%c",&s[i]);
s[i]-='';
}
kmp(); get_b();
fast_mi();
for(int i=;i<m;i++) ans=(ans+a[][i])%mo;
cout<<ans<<endl;
return ;
}
【BZOJ1009】【HNOI2008】GT考试的更多相关文章
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...
- bzoj1009 [HNOI2008] GT考试 矩阵乘法+dp+kmp
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4542 Solved: 2815[Submit][Statu ...
- [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4309 Solved: 2640[Submit][Statu ...
- bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)
1009: [HNOI2008]GT考试 题目:传送门 题解: 看这第一眼是不是瞬间想起组合数学??? 没错...这样想你就GG了! 其实这是一道稍有隐藏的矩阵乘法,好题! 首先我们可以简化一下题意: ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- [bzoj1009][HNOI2008]GT考试
Description 阿申准备报名参加考试,准考证号为位数,他不希望准考证号上出现不吉利的数字. 他的不吉利数学有位,不出现是指中没有恰好一段等于. 可以为. Input 第一行输入.接下来一行输入 ...
- [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
- bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂
https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9 ...
- BZOJ1009:[HNOI2008]GT考试(AC自动机,矩乘DP)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0< ...
随机推荐
- SharePoint 2013 Nintex Workflow 工作流帮助(七)
博客地址 http://blog.csdn.net/foxdave 工作流动作 11. Check out item(Libraries and lists分组) 与上一个对应,用于签出条目.如果一个 ...
- java基础-001
一.区分final . finally . finalize 1.关键字final Java语言的关键字final可以用于变量.类或方法,但是含义会有所不同. -用于变量:一旦初始化,变量值就不能修 ...
- HYSBZ 1858 线段树 区间合并
//Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...
- Geetest 极验验证 验证图片拼图
今天要求做一个跟魅族官网登陆的一个验证效果一样的界面 是一个拖动滑动图片进行拼图 那个效果看着很好,刚开始拿到不知道好不好做 从网上搜资料发现这是一种“极验验证码” 让用户通过滑动拼图来进行验证. 网 ...
- python global vs nonlocal (2)
上一篇中简述了这两个关键字的基本用法: global用于在局部作用于修改或重定义全局变量 nonlocal用于在内部作用域修改或重定义外部变量(全局变量除外) 这只是很浅的理解方式 注意python的 ...
- Linux Mint下编译Bochs
我在Linux Mint命令行下输入sudo apt-get install bochs安装之后发现这个没有安装gui界面,使用也存在一些问题,所以直接删掉从官网下载代码自己编译安装. 给Linux ...
- STL源码分析《3》----辅助空间不足时,如何进行归并排序
两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在 ...
- 关于HttpWebRequest.KeepAlive
于HTTP服务器每个客户端2个连接的限制这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久.今天回公司无 ...
- PHP oracle分页
oracle分页 function getall($query, $start=0, $rows=-1) { $this->dbh = oci_connect('aaa','mmm'," ...
- DIV+CSS设计IE6浮动产生双倍距离
<!doctype html><html><head> <meta name="Keywords" content="" ...