题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009

  这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优化dp。

  我们设$ f[i][j] $表示前$ i $位匹配不吉利数字$ j $位时的方案数,因为每一位的转移方式都是相同的,于是用kmp预处理出转移矩阵,直接矩乘快速幂就能过了。

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<ctime>
  6. #include<iostream>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. #define ll long long
  12. #define ull unsigned long long
  13. #define max(a,b) (a>b?a:b)
  14. #define min(a,b) (a<b?a:b)
  15. #define lowbit(x) (x& -x)
  16. #define inf 0x3f3f3f3f
  17. #define eps 1e-18
  18. #define maxn 100010
  19. 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;}
  20. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  21. inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
  22. using namespace std;
  23. struct matrix{
  24. int size;
  25. int num[][];
  26. }ans;
  27. int nxt[];
  28. char s[];
  29. int n,m,mod;
  30. matrix mul(matrix a,matrix b)
  31. {
  32. matrix c; memset(&c,,sizeof(c));
  33. c.size=a.size;
  34. for(int i=;i<=a.size;i++)
  35. for(int j=;j<=a.size;j++)
  36. for(int k=;k<=a.size;k++)
  37. c.num[i][j]=(c.num[i][j]+a.num[i][k]*b.num[k][j])%mod;
  38. return c;
  39. }
  40. matrix power(matrix a,ll b)
  41. {
  42. matrix ans; memset(&ans,,sizeof(ans));
  43. ans.size=a.size;
  44. for(int i=;i<=ans.size;i++)ans.num[i][i]=;
  45. for(;b;b>>=){
  46. if(b&)ans=mul(ans,a);
  47. a=mul(a,a);
  48. }
  49. return ans;
  50. }
  51. int main()
  52. {
  53. n=read(); m=read(); mod=read();
  54. scanf("%s",s);
  55. nxt[]=; int tmp=;
  56. for(int i=;i<=m;i++){
  57. while(tmp&&s[i]!=s[tmp])tmp=nxt[tmp];
  58. if(s[i]==s[tmp])++tmp;
  59. nxt[i+]=tmp;
  60. }
  61. for(int i=;i<m;i++)
  62. for(int j='';j<='';j++){
  63. int tmp=i;
  64. while(tmp&&j!=s[tmp])tmp=nxt[tmp];
  65. if(j==s[tmp])++tmp;
  66. if(tmp<m)++ans.num[i+][tmp+];
  67. }
  68. ans.size=m;
  69. ans=power(ans,n);
  70. int tot=;
  71. for(int i=;i<=m;i++)
  72. tot+=ans.num[][i];
  73. printf("%d\n",tot%mod);
  74. }

bzoj1009

【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)的更多相关文章

  1. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  2. BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)

    题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...

  3. BZOJ1009: [HNOI2008]GT考试 矩阵快速幂+kmp+dp

    这个题你发现打暴力的话可以记忆化搜素加剪枝,那么意味着可以递推,我们搜的话就是1010^9我们就往下匹配遇到匹配成功就return,那么我们可以想一下什么决定了状态,我们考虑kmp的过程,对于我们目前 ...

  4. 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 ...

  5. 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)

    传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...

  6. 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个 ...

  7. 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)

    Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...

  8. bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...

  9. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

随机推荐

  1. [转]廖雪峰Git教程总结

  2. 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 ...

  3. Android 4.4 (KitKat) SMS Apis Change——Android 4.4的一个重大变化

    Android团队通过Android开发博客透漏今年会放出Android 4.4 (KitKat) ,同时更新了 SMS 的部分API.博客上讲只有default SMS app才能对短信数据库有写权 ...

  4. JZOJ.5285【NOIP2017模拟8.16】排序

    Description

  5. git 四个基本对象、分支、三个存储区、reset-revert-变基、cherry-pick

    1:git四个基本对象     2:工作区.缓存去.历史区   3:Git 分支介绍 https://blog.csdn.net/wh_19910525/article/details/7470964 ...

  6. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  7. Ad Exchange

    品友互动-基于大数据技术的人工智能决策平台 http://www.ipinyou.com.cn/about?flag=milestones

  8. WebService 综合案例

    1. 需求: 集成公网手机号归属地查询服务; 对外发布自己的手机号归属地查询服务; 提供查询界面 //1. 使用 wsimport 生成公网客户端代码 // 2. 创建 SEI 接口 @WebServ ...

  9. 深入理解Mysql索与事务隔离级别

    1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  10. Internet Explorer 1.0到9.0截图画廊

    Internet Explorer 1.0 Windows 95 原先并没有IE,IE1.0是通过一个名叫Windows 95 Plus!Pack的扩展包来到用户的电脑中的,它的到来改变了Netsca ...