题意

题目链接

Sol

设\(f[i][j]\)表示枚举到位置串的第i位,当前与未知串的第j位匹配,那么我们只要保证在转移的时候永远不会匹配即可

预处理出已知串的每个位置加上某个字符后能转移到的位置,矩阵快速幂优化一下

复杂度\(O(M^3 \log n)\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 22;
  4. int N, M, mod, s[MAXN], trans[MAXN][10], p[MAXN], g[MAXN], base[MAXN];
  5. char ss[MAXN];
  6. template<typename A, typename B> inline void add2(A &x, B y) {
  7. if(x + y < 0) x = x + y + mod;
  8. else x = x + y >= mod ? x + y - mod : x + y;
  9. }
  10. int Lim;
  11. struct Ma {
  12. int m[MAXN][MAXN];
  13. Ma() {
  14. memset(m, 0, sizeof(m));
  15. }
  16. void init() {
  17. for(int i = 0; i <= Lim; i++) m[i][i] = 1;
  18. }
  19. Ma operator * (const Ma &rhs) const {
  20. Ma ans;
  21. for(int i = 0; i <= Lim; i++)
  22. for(int j = 0; j <= Lim; j++) {
  23. __int128 tmp = 0;
  24. for(int k = 0; k <= Lim; k++) tmp += 1ll * m[i][k] * rhs.m[k][j] % mod;
  25. ans.m[i][j] = tmp % mod;
  26. }
  27. return ans;
  28. }
  29. }f;
  30. void GetNxt() {
  31. int j = 0;
  32. for(int i = 0; i <= M; i++) {
  33. if(i > 1) {
  34. while(j && s[i] != s[j + 1]) j = p[j];
  35. if(s[i] == s[j + 1]) j++;
  36. p[i] = j;
  37. }
  38. for(int t = 0; t <= 9; t++) {
  39. int k = i;
  40. while(k && t != s[k + 1]) k = p[k];
  41. if(t == s[k + 1]) k++;
  42. trans[i][t] = k;
  43. }
  44. }
  45. }
  46. Ma MPow(Ma a, int p) {
  47. Ma base; base.init();
  48. while(p) {
  49. if(p & 1) base = base * a;
  50. a = a * a; p >>= 1;
  51. }
  52. return base;
  53. }
  54. int main() {
  55. cin >> N >> M >> mod; Lim = M + 1;
  56. scanf("%s", ss + 1);
  57. for(int i = 1; i <= M; i++) s[i] = ss[i] - '0';
  58. for(int i = 0; i <= 9; i++) g[i == s[1]]++;
  59. GetNxt();
  60. for(int j = 0; j <= M; j++)
  61. for(int k = 0; k <= 9; k++)
  62. if(trans[j][k] != M)
  63. f.m[trans[j][k]][j]++;
  64. Ma tmp = MPow(f, N - 1);
  65. for(int i = 0; i <= Lim; i++)
  66. for(int j = 0; j <= Lim; j++)
  67. add2(base[i], 1ll * tmp.m[i][j] * g[j] % mod);
  68. int ans = 0;
  69. for(int i = 0; i <= M - 1; i++) add2(ans, base[i]);
  70. cout << ans;
  71. return 0;
  72. }
  73. /*
  74. 4 3 100
  75. 121
  76. */

洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)的更多相关文章

  1. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  2. 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)

    传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...

  3. 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解

        看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...

  4. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

  5. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

  6. BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)

    ---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...

  7. BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  8. [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法

    Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...

  9. [HNOI2008] GT考试(DP+矩阵快速幂+KMP)

    题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ...

随机推荐

  1. 还原Azure DevOps Server (TFS)中误删除的生成流水线

    流水线历史记录 DevOps Server流水线的历史记录有完善的版本日志,用户可以随时回退到修改过程中的任何一个版本,还能比较差异.这个历史记录功能可以和代码库中的版本控制媲美. 图一:生成历史记录 ...

  2. PgAgent安装、配置、运行

    一 安装cmakewget http://www.cmake.org/files/v2.8/cmake-2.8.5.tar.gztar -zxvf cmake-2.8.5.tar.gzcd /root ...

  3. WCF学习笔记一之通过配置web.config可以通过http访问接口

    一.准备 这里涉及到三个文件,现在只是简单的把代码贴出来,后面再详细的讲一下. 三个文件分别是(都是wcf服务应用程序项目下的): 1.IService1.cs 2.Service1.svc 3.We ...

  4. 背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图

    [源码下载] 背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取文件夹的属性 ...

  5. 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件

    [源码下载] 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件 作者: ...

  6. pycharm中新建external tools

    1.Settings-Tools-External Tools 点击+号 2.Tools settings中的设置如下: Program: $PyInterpreterDirectory$/pytho ...

  7. jQuery基础与JavaScript与CSS交互-第五章

    目录 JavaScript框架种类及其优缺点 jQuery库 jQuery对象$ 掌握基本选择器 掌握过滤选择器 掌握表单选择器 RIA技术 常见的RIA技术 Ajax Sliverlight Fle ...

  8. Java学习笔记37(字节流)

    输出:程序到文件 输入:文件到程序 字节输出流:OutputStream类 作用:在java程序中写文件 这个类是抽象类,必须使用它的子类 方法: 写入: package demo; import j ...

  9. javascript History对象属性和方法

    History对象 History对象包含用户(在浏览器窗口中)访问过的URL length: 返回浏览器历史列表中的URL数量(打开浏览器,访问淘宝,返回1,再访问百度,返回2) History对象 ...

  10. Redis最新面试题26题(初级、中级Redis面试题)

    Redis 1级(入门基础) 1.Redis有哪些数据类型? string,list,set,sorted set(Zset),hash 2.集合和列表有什么区别? 列表是可以从两端推入.推出数据的队 ...