$dp$,矩阵加速。

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

设$dp[i][j][1]$表示:长度为$i$的两个字符串,之前已经出现过长度为$m$相同的,目前为止最后$j$个是相同的。

递推式很容易写,$n$有点大,矩阵加速。下图以$m=4$为例构造矩阵。

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<stack>
  11. #include<iostream>
  12. using namespace std;
  13. typedef long long LL;
  14. const double pi=acos(-1.0),eps=1e-;
  15. void File()
  16. {
  17. freopen("D:\\in.txt","r",stdin);
  18. freopen("D:\\out.txt","w",stdout);
  19. }
  20. template <class T>
  21. inline void read(T &x)
  22. {
  23. char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
  24. while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
  25. }
  26.  
  27. LL n,MOD=;
  28. int T,m,k;
  29.  
  30. struct Matrix
  31. {
  32. long long A[][];
  33. int R, C;
  34. Matrix operator*(Matrix b);
  35. };
  36.  
  37. Matrix X, Y, Z;
  38.  
  39. Matrix cheng(Matrix a,Matrix b)
  40. {
  41. Matrix c;
  42. int i, j, k;
  43. for (i = ; i <= a.R; i++)
  44. for (j = ; j <= b.C; j++){
  45. c.A[i][j]=;
  46. for (k = ; k <= a.C; k++)
  47. c.A[i][j] = (c.A[i][j] + (a.A[i][k] * b.A[k][j]) % MOD) % MOD;
  48. }
  49. c.R = a.R; c.C = b.C;
  50. return c;
  51. }
  52.  
  53. void init()
  54. {
  55. memset(X.A, , sizeof X.A);
  56. memset(Y.A, , sizeof Y.A);
  57. memset(Z.A, , sizeof Z.A);
  58.  
  59. Y.R = *(m+); Y.C = *(m+);
  60. for (int i = ; i <= *(m+); i++) Y.A[i][i] = ;
  61.  
  62. X.R = *(m+); X.C = *(m+);
  63.  
  64. for(int i=;i<=m;i++) X.A[i][]=k*(k-);
  65. for(int i=;i<=m-;i++) X.A[i][i+]=k;
  66.  
  67. for(int i=m+;i<=*m+;i++) X.A[i][m+]=k*(k-);
  68. for(int i=m+;i<=*m+;i++) X.A[i][i+]=k;
  69. X.A[m][*m+]=k;
  70.  
  71. Z.R = ; Z.C = *(m+);
  72. Z.A[][]=;
  73. }
  74.  
  75. void work()
  76. {
  77. while (n)
  78. {
  79. if (n % == ) Y = cheng(Y,X);
  80. n = n >> ;
  81. X = cheng(X,X);
  82. }
  83. Z = cheng(Z,Y);
  84. LL ans=; for(int i=m+;i<=*(m+);i++) ans=(ans+Z.A[][i])%MOD;
  85. printf("%lld\n",ans);
  86. }
  87.  
  88. int main()
  89. {
  90. scanf("%d",&T);
  91. while(T--)
  92. {
  93. scanf("%lld%d%d",&n,&m,&k);
  94. init();
  95. work();
  96. }
  97. return ;
  98. }

HDU 5863 cjj's string game的更多相关文章

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

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

  2. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  3. HDU 5842 Lweb and String(Lweb与字符串)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  4. hdu 4850 Wow! Such String! 欧拉回路

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...

  5. hdu 3553 Just a String (后缀数组)

    hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...

  6. HDU 4850 Wow! Such String!(欧拉道路)

    HDU 4850 Wow! Such String! 题目链接 题意:求50W内的字符串.要求长度大于等于4的子串,仅仅出现一次 思路:须要推理.考虑4个字母的字符串,一共同拥有26^4种,这些由这些 ...

  7. HDU5863 cjj's string game(DP + 矩阵快速幂)

    题目 Source http://acm.split.hdu.edu.cn/showproblem.php?pid=5863 Description cjj has k kinds of charac ...

  8. HDU 3336 Count the string(KMP的Next数组应用+DP)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. HDU 5842 Lweb and String (水题)

    Lweb and String 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...

随机推荐

  1. 某大神C#框架后台发送信息的查找及破解

    最近在博客园瞎逛的时候,发现了某个大神发布的一个c#框架,一看框架,叫牛逼框架,嗯,装B效果太好了,界面很炫,虽然有很多的组件还是不怎么完善,但是,已经可以初步运用于项目了. 先来看看界面:   在进 ...

  2. IronPython .NET Integration官方文档翻译笔记

    http://ironpython.net/documentation/dotnet/这是原文地址 以下笔记仅记录阅读过程中我认为有必要记录的内容,大多数都是依赖翻译软件的机翻,配合个人对代码的理解写 ...

  3. python3.5学习之路_day1_login

    登录程序1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor zhangxiaoyu ...

  4. 使用Redis的Java客户端Jedis

    转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行 ...

  5. php中switch语句case后表达式写法记录一

    可作等级评价: $var = 95; switch(true){ case $var < 100; $level = 1; break; case $var < 95; $level = ...

  6. datagridview自绘

    https://msdn.microsoft.com/zh-cn/library/85kxk29c(v=vs.85).aspx 以上效果实现代码如下,细节部分就由你完善了,这里只是写个小例子: usi ...

  7. StringBuilder跟StringBuffer

    一直以来只知道StringBuffer是线程安全的,StringBuilder是线程不安全的, 所以通常情况下使用StringBuilder,这样可以提升效率!!! 今天由于想起StringBuild ...

  8. Android中Activity全局共享方法AppContext

    在 android 的所有 activity 中共享同一个对象实例的方法 1. 新建 AppContext.java 文件(名称可自定义) public class AppContext extend ...

  9. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  10. swift 中Value Type VS Class Type

    ios 中Value Type 和 Class Type 有哪些异同点,这个问题是在微信的公共帐号中看到的,觉得挺有意思,这里梳理一下. 1.swift 中为什么要设置值类型? 值类型在参数传递.赋值 ...