目录

题目链接

loj#2128. 「HAOI2015」数字串拆分

题解

\(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\)

这个可以用转移矩阵通过矩阵乘法处理出来

预处理出\(A[i][j]\)表示数S为\(j * 10 ^ i\)的转移矩阵

对于g的转移

\(g(i) = \sum_{j = 0}^{i - 1}g(j) * D(j + 1,i)\)

D[i][j]表示第i位到底j位构成的数的f,(转移矩阵

对于g的转移也是需要矩阵的

g(0) = 1也就是{0,0,0,.....,0,1}

代码


  1. #include<map>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define gc getchar()
  7. #define pc putchar
  8. #define LL long long
  9. inline int read() {
  10. int x = 0,f = 1;
  11. char c = gc;
  12. while(c < '0' || c > '9')c = gc;
  13. while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
  14. return x * f;
  15. }
  16. void print(int x) {
  17. if(x < 0) {
  18. pc('-');
  19. x = -x;
  20. }
  21. if(x >= 10) print(x / 10);
  22. pc(x % 10 + '0');
  23. }
  24. const int maxn = 507;
  25. int n,m;
  26. const int mod = 998244353;
  27. struct Ma {
  28. int a[6][6];
  29. Ma() { memset(a,0,sizeof a); }
  30. Ma operator * (const Ma & t)const {
  31. Ma ret;
  32. memset(ret.a,0,sizeof ret.a);
  33. for(int i = 1;i <= m;++ i)
  34. for(int j = 1;j <= m;++ j)
  35. for(int k = 1;k <= m;++ k)
  36. (ret.a[i][j] += 1ll * a[i][k] * t.a[k][j] % mod) %= mod;
  37. return ret;
  38. }
  39. Ma operator + (const Ma &k)const {
  40. Ma ret;
  41. memset(ret.a,0,sizeof ret.a);
  42. for(int i = 1;i <= m;++ i)
  43. for(int j = 1;j <= m;++ j)
  44. ret.a[i][j] = (a[i][j] + k.a[i][j]) % mod;
  45. return ret;
  46. }
  47. } A[maxn][10],f[maxn];
  48. char s[maxn];
  49. int main() {
  50. scanf("%s",s + 1);
  51. n = strlen(s + 1);
  52. m = read();
  53. for(int i = 1;i <= m;++ i)
  54. A[0][0].a[i][i] = 1 ,
  55. A[0][1].a[i][m] = 1;
  56. for(int i = 1;i < m;++ i)
  57. A[0][1].a[i + 1][i] = 1;
  58. for(int i = 2;i <= 9;++ i)
  59. A[0][i] = A[0][i - 1] * A[0][1];
  60. for(int i = 1;i <= n;++ i) { //十进制快速幂
  61. A[i][0] = A[0][0];
  62. A[i][1] = A[i - 1][9] * A[i - 1][1];
  63. for(int j = 2;j <= 9;++ j)
  64. A[i][j] = A[i][j - 1] * A[i][1];
  65. }
  66. f[0].a[1][m] = 1;
  67. Ma now;
  68. for(int i = 1;i <= n;++ i) {
  69. now = A[0] [s[i] - '0'];
  70. for(int j = i - 1;j >= 0;-- j) {
  71. f[i] = f[i] + (f[j] * now);
  72. if(j) now = A[i - j][s[j] - '0'] * now;
  73. }
  74. }
  75. print(f[n].a[1][m]);
  76. pc('\n');
  77. return 0;
  78. }

loj#2128. 「HAOI2015」数字串拆分 矩阵乘法的更多相关文章

  1. 【LOJ】#2128. 「HAOI2015」数字串拆分

    题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...

  2. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  3. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  4. LOJ#2127「HAOI2015」按位或

    用$ Min-Max$容斥之后要推的东西少了好多 无耻的用实数快读抢了BZOJ.Luogu.LOJ三个$ OJ$的Rank 1 即将update:被STO TXC OTZ超了QAQ 题意:集合$ [0 ...

  5. LOJ#2083. 「NOI2016」优秀的拆分

    $n \leq 30000$的字符串,问其所有子串的所有AABB形式的拆分有多少种.$t \leq 10$组询问. $n^3$过80,$n^2$过95,鬼去写正解.. $n^2$:先枚举一次算每个位置 ...

  6. 「BZOJ2510」弱题(矩阵乘法,降维)

    有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < ...

  7. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

随机推荐

  1. MRPT 安装使用

    1. 安装mrpt ( apt-get ) $ sudo apt-get install mrpt-apps libmrpt-dev 2. 下载mrpt-1.3 链接:https://github.c ...

  2. 【转】inotify+rsync实现实时同步

    [转]inotify+rsync实现实时同步 1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服 ...

  3. linux内核capable源代码分析【转】

    转自:https://blog.csdn.net/sanwenyublog/article/details/50856849 linux内核里对于进程的权限管理有一个很重要的函数capable,以前看 ...

  4. linux暂停一个在运行中的进程【转】

    转自:https://blog.csdn.net/Tim_phper/article/details/53536621 转载于: http://www.cszhi.com/20120328/linux ...

  5. Android:注册登录

    注册登录的实现 先在layout里新建一个xml文件: //login.xml <?xml version="1.0" encoding="utf-8"? ...

  6. pytorch实现花朵数据集读取

    import os from PIL import Image from torch.utils import data import numpy as np from torchvision imp ...

  7. C++ code:指针类型(pointer types)

    #include <iostream> using namespace std; int main() { float f = 34.5; int *ip = reinterpret_ca ...

  8. Python 列表推导、迭代器与生成器

    1.列表推导 1 2 3 4 5 6 7 8 9 10 11 numbers = [i for i in range(10) if i % 2 == 0] print(numbers)   seq = ...

  9. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  10. jquery的clone方法应用于textarea和select的bug修复不能copy值,clone id重复的解决

    textarea和select的值clone的时候会丢掉,在clone的时候将val再重新赋值一下,如果知道这个了就简单了, 测试发现,textarea和select的jquery的clone方法有问 ...