Advertisement
cincout

Untitled

Sep 25th, 2019
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define mp make_pair
  4.  
  5. using namespace std;
  6.  
  7. const int N = 20;
  8. const int MOD = 2520;
  9. const int R = 50;
  10.  
  11. long long dp[N][MOD][R][2];
  12.  
  13. int __gcd(int a, int b) {
  14. while (b) {
  15. a %= b;
  16. swap(a, b);
  17. }
  18. return a;
  19. }
  20.  
  21. int __lcm(int a, int b) {
  22. if (a == 0 && b == 0) {
  23. return 0;
  24. }
  25. if (a == 0) return b;
  26. if (b == 0) return a;
  27. return a / __gcd(a, b) * b;
  28. }
  29.  
  30. int dig(char t) {
  31. return t - '0';
  32. }
  33.  
  34. long long calc(long long r) {
  35. string s = to_string(r);
  36. fill(&dp[0][0][0][0], &dp[0][0][0][0] + N * MOD * R * 2, 0);
  37.  
  38. for (int i = 0; i < dig(s[0]); ++i) {
  39. dp[0][i][i][1] = 1;
  40. }
  41. dp[0][dig(s[0])][dig(s[0])][0] = 1;
  42.  
  43. for (int i = 0; i + 1 < s.size(); ++i) {
  44. for (int mod = 0; mod < MOD; ++mod) {
  45. for (int lcm = 0; lcm < R; ++lcm) {
  46. // 1 updates
  47. for (int nxt = 0; nxt < 10; ++nxt) {
  48. int newmod = ((mod * 10) % MOD + (nxt) % MOD) % MOD;
  49. int newlcm = __lcm(lcm, nxt);
  50. dp[i + 1][newmod][newlcm][1] += dp[i][mod][lcm][1];
  51. }
  52. // 0 updates
  53. for (int nxt = 0; nxt < dig(s[i + 1]); ++nxt) {
  54. int newmod = ((mod * 10) % MOD + (nxt) % MOD) % MOD;
  55. int newlcm = __lcm(lcm, nxt);
  56. dp[i + 1][newmod][newlcm][1] += dp[i][mod][lcm][0];
  57. }
  58. int newmod = ((mod * 10) % MOD + (dig(s[i + 1]) % MOD)) % MOD;
  59. int newlcm = __lcm(lcm, dig(s[i + 1]));
  60. dp[i + 1][newmod][newlcm][0] += dp[i][mod][lcm][0];
  61. }
  62. }
  63. }
  64.  
  65. int len = s.size() - 1;
  66. long long res = 0;
  67. for (int i = 0; i < MOD; ++i) {
  68. for (int c = 1; c < R; ++c) {
  69. if (i % c == 0) {
  70. res += dp[len][i][c][0] + dp[len][i][c][1];
  71. }
  72. }
  73. }
  74.  
  75. return res;
  76.  
  77. }
  78.  
  79. int main() {
  80. ios::sync_with_stdio(false);
  81. cin.tie(0);
  82.  
  83. int t;
  84. cin >> t;
  85. while (t--) {
  86. long long l, r;
  87. cin >> l >> r;
  88. cout << calc(r) - calc(l - 1) << '\n';
  89. }
  90.  
  91. return 0;
  92. }
  93.  
  94. /*
  95. * int overflow, array bounds
  96. * special cases (n=1?), set tle
  97. * do smth instead of nothing and stay organized
  98. * double troubles
  99. * same points in geoma
  100. * in game theory find win's cases
  101. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement