题目链接

题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数

分析 :

直觉是DP

不过当时看到 n 很大、但是 m 很小的时候

发现此题DP并不合适、于是想可能是某种组合数学的问题可以直接公式算

看到题解的我、恍然大悟、对于这种数据、可以考虑一下矩阵快速幂优化的DP

首先要想到线性递推的 DP 式子

最直观的想法就是 dp[i][j] = 到第 i 个位置为止、前面最长匹配长度为 j 的方案数

但是如果仔细想想、这样子的定义状态并不好转移、遂换一种思路

定义 dp[i][j] = 到第 i 个位置为止、以第 i 个字符为结尾的匹配串的长度为 j 的方案数

有转移

dp[i][0] = (dp[i-1][0] + dp[i-1][1] + .... + dp[i-1][m] ) * k * (k-1)   (k * (k-1) 的意义是a、b串第 i 个字符不一样的方案数)

dp[i][j] = dp[i-1][j-1] * k ( j ≤ i )

然后尝试去构造矩阵、此处引用 链接

但是注意一下这里的 DP 意义、答案最后并不是 dp[n][m]

dp[n][0] + dp[n][1] + ... + dp[n][m] 可以看成到第 n 个位置为止匹配长度 ≤ m 的方案数

那么如果可以得到匹配长度 ≤ m-1 的方案数两者相减就可以得到匹配长度恰为 m 的方案数了

所以做两次矩阵快速幂即可

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define ULL unsigned long long
  4.  
  5. #define scl(i) scanf("%lld", &i)
  6. #define scll(i, j) scanf("%lld %lld", &i, &j)
  7. #define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
  8. #define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)
  9.  
  10. #define scs(i) scanf("%s", i)
  11. #define sci(i) scanf("%d", &i)
  12. #define scd(i) scanf("%lf", &i)
  13. #define scIl(i) scanf("%I64d", &i)
  14. #define scii(i, j) scanf("%d %d", &i, &j)
  15. #define scdd(i, j) scanf("%lf %lf", &i, &j)
  16. #define scIll(i, j) scanf("%I64d %I64d", &i, &j)
  17. #define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
  18. #define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
  19. #define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
  20. #define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)
  21. #define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)
  22. #define scIllll(i, j, k, l) scanf("%I64d %I64d %I64d %I64d", &i, &j, &k, &l)
  23.  
  24. #define lson l, m, rt<<1
  25. #define rson m+1, r, rt<<1|1
  26. #define lowbit(i) (i & (-i))
  27. #define mem(i, j) memset(i, j, sizeof(i))
  28.  
  29. #define fir first
  30. #define sec second
  31. #define VI vector<int>
  32. #define ins(i) insert(i)
  33. #define pb(i) push_back(i)
  34. #define pii pair<int, int>
  35. #define VL vector<long long>
  36. #define mk(i, j) make_pair(i, j)
  37. #define all(i) i.begin(), i.end()
  38. #define pll pair<long long, long long>
  39.  
  40. #define _TIME 0
  41. #define _INPUT 0
  42. #define _OUTPUT 0
  43. clock_t START, END;
  44. void __stTIME();
  45. void __enTIME();
  46. void __IOPUT();
  47. using namespace std;
  48.  
  49. ;
  50. ;
  51.  
  52. struct MAT{
  53. LL val[][];
  54. int sz;
  55. MAT(){};
  56. MAT(, sizeof(val)); }
  57. friend MAT operator * (const MAT & A, const MAT & B){
  58. MAT C(A.sz);
  59. ; k <= C.sz; k++)
  60. ; i <= C.sz; i++){
  61. ) continue;
  62. ; j <= C.sz; j++){
  63. C.val[i][j] = C.val[i][j] + A.val[i][k] * B.val[k][j] % mod;
  64. if(C.val[i][j] >= mod) C.val[i][j] -= mod;
  65. }
  66. }
  67. return C;
  68. }
  69. };
  70.  
  71. MAT pow_mod(MAT a, LL b)
  72. {
  73. MAT ret(a.sz);
  74. ; i<=ret.sz; i++) ret.val[i][i] = ;
  75. while(b){
  76. ) ret = ret * a;
  77. a = a * a;
  78. b >>= ;
  79. }return ret;
  80. }
  81.  
  82. LL Cal(int n, int m, int k)
  83. {
  84. MAT A(m+);
  85. ; i<=A.sz; i++) A.val[][i] = 1LL * k * (k - );
  86. ; i<=A.sz; i++) A.val[i][i-] = k * 1LL;
  87.  
  88. A = pow_mod(A, n);
  89.  
  90. LL ret = ;
  91. ; i<=A.sz; i++)
  92. ret = (ret + A.val[i][]) % mod;
  93. return ret;
  94. }
  95.  
  96. int main(void){__stTIME();__IOPUT();
  97.  
  98. int nCase;
  99.  
  100. sci(nCase);
  101.  
  102. while(nCase--){
  103. int n, m, k;
  104. sciii(n, m, k);
  105. printf(, k) + mod) % mod);
  106. }
  107.  
  108. __enTIME();;}
  109.  
  110. void __stTIME()
  111. {
  112. #if _TIME
  113. START = clock();
  114. #endif
  115. }
  116.  
  117. void __enTIME()
  118. {
  119. #if _TIME
  120. END = clock();
  121. cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
  122. #endif
  123. }
  124.  
  125. void __IOPUT()
  126. {
  127. #if _INPUT
  128. freopen("in.txt", "r", stdin);
  129. #endif
  130. #if _OUTPUT
  131. freopen("out.txt", "w", stdout);
  132. #endif
  133. }

HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )的更多相关文章

  1. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  2. HDU 5863 cjj's string game (矩阵乘法优化递推)

    题目大意:用k种字符构建两个长度为n的字符串(每种字符有无限多个),要求对应位置字符相同的连续子串最长长度为m,问方法数. 其中k,n,m是输入,n(1<=n<=1000000000), ...

  3. HDU 5863 cjj's string game

    $dp$,矩阵加速. 设$dp[i][j][0]$表示:长度为$i$的两个字符串,之前还未出现过长度为$m$相同的,目前为止最后$j$个是相同的. 设$dp[i][j][1]$表示:长度为$i$的两个 ...

  4. hdu 5564 Clarke and digits 矩阵快速幂优化数位dp

    Clarke and digits Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的 ...

  6. Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)

    题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...

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

  8. HDU——4291A Short problem(矩阵快速幂+循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

随机推荐

  1. (十六)JDBC 处理大数据

    目录 前言: 基本概念 对于Mysql的Text类型 流地址的写法 blob类型数据 备注 前言: 在实际开发中,程序需要把 大文本或二进制 数据保存到数据库中: 实际上,我们并不存储大的数据到数据库 ...

  2. fiddler笔记:TimeLine时间轴选项卡

    1.TimeLine选项卡介绍 TimeLine选项卡支持使用"瀑布"模型查看1~250个选中的Session.主要用于帮助性能分析和理解请求之间的关联.选项卡的主体内容是数据流视 ...

  3. python 爬取文章后存储excel 以及csv

    import requests from bs4 import BeautifulSoup import random import openpyxl xls=openpyxl.Workbook() ...

  4. Spring实战(四)Spring高级装配中的bean profile

    profile的原意为轮廓.剖面等,软件开发中可以译为“配置”. 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个 ...

  5. Centos 7.3 搭建php7,mysql5.7,nginx1.10.1,redis

    一.安装nginx 更新系统软件(非必要) # yum update 安装nginx 1.下载nginx # wget http://nginx.org/download/nginx-1.15.2.t ...

  6. .Net C# RSA签名和验签

    帮助类 using System; using System.Text; using System.IO; using System.Security.Cryptography; namespace ...

  7. java Map 四种遍历方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  8. C++性能榨汁机之无锁编程

    C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...

  9. 一个SDL2.0程序的分析

    //把图片加载到SDL_Texture SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){       ...

  10. Spark读取HDFS文件,任务本地化(NODE_LOCAL)

    Spark也有数据本地化的概念(Data Locality),这和MapReduce的Local Task差不多,如果读取HDFS文件,Spark则会根据数据的存储位置,分配离数据存储最近的Execu ...