【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009
这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优化dp。
我们设$ f[i][j] $表示前$ i $位匹配不吉利数字$ j $位时的方案数,因为每一位的转移方式都是相同的,于是用kmp预处理出转移矩阵,直接矩乘快速幂就能过了。
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- #include<cstring>
- #include<ctime>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #include<map>
- #define ll long long
- #define ull unsigned long long
- #define max(a,b) (a>b?a:b)
- #define min(a,b) (a<b?a:b)
- #define lowbit(x) (x& -x)
- #define inf 0x3f3f3f3f
- #define eps 1e-18
- #define maxn 100010
- inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
- inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
- inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
- using namespace std;
- struct matrix{
- int size;
- int num[][];
- }ans;
- int nxt[];
- char s[];
- int n,m,mod;
- matrix mul(matrix a,matrix b)
- {
- matrix c; memset(&c,,sizeof(c));
- c.size=a.size;
- for(int i=;i<=a.size;i++)
- for(int j=;j<=a.size;j++)
- for(int k=;k<=a.size;k++)
- c.num[i][j]=(c.num[i][j]+a.num[i][k]*b.num[k][j])%mod;
- return c;
- }
- matrix power(matrix a,ll b)
- {
- matrix ans; memset(&ans,,sizeof(ans));
- ans.size=a.size;
- for(int i=;i<=ans.size;i++)ans.num[i][i]=;
- for(;b;b>>=){
- if(b&)ans=mul(ans,a);
- a=mul(a,a);
- }
- return ans;
- }
- int main()
- {
- n=read(); m=read(); mod=read();
- scanf("%s",s);
- nxt[]=; int tmp=;
- for(int i=;i<=m;i++){
- while(tmp&&s[i]!=s[tmp])tmp=nxt[tmp];
- if(s[i]==s[tmp])++tmp;
- nxt[i+]=tmp;
- }
- for(int i=;i<m;i++)
- for(int j='';j<='';j++){
- int tmp=i;
- while(tmp&&j!=s[tmp])tmp=nxt[tmp];
- if(j==s[tmp])++tmp;
- if(tmp<m)++ans.num[i+][tmp+];
- }
- ans.size=m;
- ans=power(ans,n);
- int tot=;
- for(int i=;i<=m;i++)
- tot+=ans.num[][i];
- printf("%d\n",tot%mod);
- }
bzoj1009
【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)的更多相关文章
- BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)
题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...
- BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...
- BZOJ1009: [HNOI2008]GT考试 矩阵快速幂+kmp+dp
这个题你发现打暴力的话可以记忆化搜素加剪枝,那么意味着可以递推,我们搜的话就是1010^9我们就往下匹配遇到匹配成功就return,那么我们可以想一下什么决定了状态,我们考虑kmp的过程,对于我们目前 ...
- 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)
传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1 ...
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...
- 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)
传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...
- 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)
Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...
- bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
随机推荐
- [转]廖雪峰Git教程总结
- Python 基础之列表去重的几种玩法
列表去重 1.方法1 借助一个临时列表 ids = [1,2,3,3,4,2,3,4,5,6,1] news_ids = [] for id in ids: if id not in news_ids ...
- Android 4.4 (KitKat) SMS Apis Change——Android 4.4的一个重大变化
Android团队通过Android开发博客透漏今年会放出Android 4.4 (KitKat) ,同时更新了 SMS 的部分API.博客上讲只有default SMS app才能对短信数据库有写权 ...
- JZOJ.5285【NOIP2017模拟8.16】排序
Description
- git 四个基本对象、分支、三个存储区、reset-revert-变基、cherry-pick
1:git四个基本对象 2:工作区.缓存去.历史区 3:Git 分支介绍 https://blog.csdn.net/wh_19910525/article/details/7470964 ...
- 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
[BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...
- Ad Exchange
品友互动-基于大数据技术的人工智能决策平台 http://www.ipinyou.com.cn/about?flag=milestones
- WebService 综合案例
1. 需求: 集成公网手机号归属地查询服务; 对外发布自己的手机号归属地查询服务; 提供查询界面 //1. 使用 wsimport 生成公网客户端代码 // 2. 创建 SEI 接口 @WebServ ...
- 深入理解Mysql索与事务隔离级别
1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...
- Internet Explorer 1.0到9.0截图画廊
Internet Explorer 1.0 Windows 95 原先并没有IE,IE1.0是通过一个名叫Windows 95 Plus!Pack的扩展包来到用户的电脑中的,它的到来改变了Netsca ...