[关闭]
@ZCDHJ 2019-08-07T09:45:50.000000Z 字数 1341 阅读 432

HAOI2015 数字串拆分

未分类


枚举最后一个出现的数字来计算 ,那么 ,很显然可以矩阵加速。设转移矩阵为 ,对于 ,因为 ,以及矩阵满足分配率,枚举最后一个断点, 表示的是所有 矩阵的和,直接递推计算即可。总复杂度

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. const int MAXN = 500;
  5. const int MOD = 998244353;
  6. int n, m;
  7. char s[MAXN + 2];
  8. struct Matrix {
  9. int a[6][6];
  10. Matrix() {
  11. memset(a, 0, sizeof(a));
  12. }
  13. friend Matrix operator* (const Matrix &lhs, const Matrix &rhs) {
  14. Matrix res;
  15. for (int i = 1; i <= m; ++i)
  16. for (int j = 1; j <= m; ++j)
  17. for (int k = 1; k <= m; ++k)
  18. res.a[i][j] = (1LL * res.a[i][j] + 1LL * lhs.a[i][k] * rhs.a[k][j]) % MOD;
  19. return res;
  20. }
  21. friend Matrix operator+ (const Matrix &lhs, const Matrix &rhs) {
  22. Matrix res;
  23. for (int i = 1; i <= m; ++i)
  24. for (int j = 1; j <= m; ++j)
  25. res.a[i][j] = (lhs.a[i][j] + rhs.a[i][j]) % MOD;
  26. return res;
  27. }
  28. void out() {
  29. for (int i = 1; i <= m; ++i) {
  30. for (int j = 1; j <= m; ++j) printf("%d ", a[i][j]);
  31. printf("\n");
  32. }
  33. }
  34. void init() {
  35. for (int i = 1; i <= m; ++i) a[i][i] = 1;
  36. }
  37. } dp[MAXN | 1], d[MAXN | 1][10];
  38. int main() {
  39. scanf("%s", s + 1);
  40. scanf("%d", &m);
  41. n = strlen(s + 1);
  42. for (int i = 1; i <= m; ++i) {
  43. d[0][1].a[i][m] = 1;
  44. if (i > 1) d[0][1].a[i][i - 1] = 1;
  45. }
  46. dp[0].a[1][m] = 1;
  47. for (int i = 0; i <= n; ++i) {
  48. for (int j = 1; j < 10; ++j) {
  49. if (i == 0 && j == 1) continue;
  50. if (j == 1) d[i][j] = d[i - 1][9] * d[i - 1][1];
  51. else d[i][j] = d[i][j - 1] * d[i][1];
  52. }
  53. }
  54. s[0] = '0';
  55. for (int i = 1; i <= n; ++i) {
  56. Matrix now;
  57. now.init();
  58. for (int j = i - 1; j >= 0; --j) {
  59. if (s[j + 1] != '0') {
  60. now = now * d[i - 1 - j][s[j + 1] - '0'];
  61. }
  62. dp[i] = dp[i] + (dp[j] * now);
  63. }
  64. }
  65. printf("%d\n", dp[n].a[1][m] % MOD);
  66. return 0;
  67. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注