Advertisement
a53

Magic Digits

a53
Aug 18th, 2021
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <map>
  5. #include <set>
  6. using namespace std;
  7. #define mod 666013
  8. int n, k;
  9. long long powmod(long long a, long long b) {
  10. if (b == 0) {
  11. return 1;
  12. }
  13. if (b % 2 == 1) {
  14. return (a * powmod(a, b - 1)) % mod;
  15. }
  16. long long P = powmod(a, b / 2);
  17. return (P * P) % mod;
  18. }
  19. long long invers(long long a) {
  20. return powmod(a, mod - 2);
  21. }
  22. vector<long long> fact;
  23. vector<long long> inv;
  24. long long combs(long long n, long long k) {
  25. return (((fact[n] * inv[k]) % mod) * inv[n - k]) % mod;
  26. }
  27. void precompute(long long n) {
  28. fact = vector<long long>(n + 1);
  29. fact[0] = 1;
  30. for (long long i = 1; i <= n; ++i) {
  31. fact[i] = fact[i - 1ll] * i;
  32. fact[i] %= mod;
  33. }
  34. inv = vector<long long>(n + 1);
  35. inv[n] = invers(fact[n]);
  36. for (long long i = n - 1; i >= 0; --i) {
  37. inv[i] = ((i + 1ll) * inv[i + 1ll]) % mod;
  38. }
  39. }
  40. long long solve(long long min, long long max) {
  41. vector<vector<vector<vector<long long>>>> dp
  42. (10, vector<vector<vector<long long>>>
  43. (n + 1ll, vector<vector<long long>>(2, vector<long long>(2))));
  44. for (long long i = 0; i <= 9; ++i) {
  45. dp[i][0][0][0] = 1;
  46. }
  47. for (long long i = 1; i <= 9; ++i) {
  48. for (long long j = 1; j <= n; ++j) {
  49. dp[i][j][0][1] = dp[i - 1][j][0][1];
  50. dp[i][j][1][0] = dp[i - 1][j][1][0];
  51. dp[i][j][0][0] = dp[i - 1][j][0][0];
  52. dp[i][j][1][1] = dp[i - 1][j][1][1];
  53. for (long long t = min + 1; t <= j && t < max; ++t) {
  54. dp[i][j][0][1] += combs(j, t) * dp[i - 1][j - t][0][1];
  55. dp[i][j][0][1] %= mod;
  56. dp[i][j][1][0] += combs(j, t) * dp[i - 1][j - t][1][0];
  57. dp[i][j][1][0] %= mod;
  58. dp[i][j][0][0] += combs(j, t) * dp[i - 1][j - t][0][0];
  59. dp[i][j][0][0] %= mod;
  60. dp[i][j][1][1] += combs(j, t) * dp[i - 1][j - t][1][1];
  61. dp[i][j][1][1] %= mod;
  62. }
  63. if (min == max && j >= min) {
  64. dp[i][j][1][1] += combs(j, min) *
  65. (dp[i - 1][j - min][1][1] + dp[i - 1][j - min][0][0]
  66. + dp[i - 1][j - min][1][0] + dp[i - 1][j - min][0][1]);
  67. dp[i][j][1][1] %= mod;
  68. }
  69. else {
  70. if (j >= min) {
  71. dp[i][j][1][0] += combs(j, min) * (dp[i - 1][j - min][1][0] + dp[i - 1][j - min][0][0]);
  72. dp[i][j][1][0] %= mod;
  73. dp[i][j][1][1] += combs(j, min) * (dp[i - 1][j - min][1][1] + dp[i - 1][j - min][0][1]);
  74. dp[i][j][1][1] %= mod;
  75. }
  76. if (j >= max) {
  77. dp[i][j][0][1] += combs(j, max) * (dp[i - 1][j - max][0][1] + dp[i - 1][j - max][0][0]);
  78. dp[i][j][0][1] %= mod;
  79. dp[i][j][1][1] += combs(j, max) * (dp[i - 1][j - max][1][1] + dp[i - 1][j - max][1][0]);
  80. dp[i][j][1][1] %= mod;
  81. }
  82. }
  83. }
  84. }
  85. return dp[9][n][1][1];
  86. }
  87. int main() {
  88. cin >> n >> k;
  89. if (k > n) {
  90. if (k == 2 * n) {
  91. cout << 9;
  92. }
  93. else {
  94. cout << 0;
  95. }
  96. return 0;
  97. }
  98. precompute(n);
  99. long long ans = 0;
  100. long long p1 = 1, p2 = k - 1ll;
  101. while (p1 <= p2) {
  102. ans += solve(p1, p2);
  103. ans %= mod;
  104. p1++;
  105. p2--;
  106. }
  107. cout << ans;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement