fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define ull unsigned ll
  7. #define ld long double
  8. typedef vector<int> vi;
  9. typedef multiset<int> mi;
  10. typedef multiset<ll> mll;
  11. typedef vector<ll> vll;
  12. typedef vector<bool> vb;
  13. typedef vector<string> vs;
  14. typedef set<ll> sll;
  15. typedef vector<vector<int>> _2vi;
  16. typedef vector<vector<ll>> _2vll;
  17. #define all(v) ((v).begin()), ((v).end())
  18. #define sz(v) ((ll)((v).size()))
  19.  
  20. #define vinp(v, n) \
  21.   for (ull i = 0; i < (n); i++) \
  22.   cin >> (v)[i]
  23. #define printv(v) \
  24.   for (auto i : (v)) \
  25.   cout << i << " "
  26. #define fr0(i, n) for (ull(i) = 0; (i) < (n); (i)++)
  27. #define fr1(i, n) for (ull(i) = 1; (i) < (n); (i)++)
  28. #define fr(i, x, n) for (ull(i) = (x); (i) < (n); (i)++)
  29. #define _CRT_SECURE_NO_WARNING
  30. const ll MOD = 1000000007;
  31.  
  32. void Bustany() {
  33. ios_base::sync_with_stdio(false);
  34. cin.tie(NULL);
  35. cout.tie(NULL);
  36. #ifndef ONLINE_JUDGE
  37. freopen("./in.txt", "r", stdin), freopen("./out.txt", "w", stdout);
  38. #endif
  39. }
  40.  
  41. const ll N = 1e5 + 5;
  42. vector<sll> adj(N);
  43. //_2vll adj(N,vll(N));
  44. //vb vis;
  45. string a, b;
  46.  
  47. ll dp[19][163][163][2][2];
  48. int vis[19][163][163][2][2];
  49.  
  50. int g = 0;
  51.  
  52. /*
  53.  ? Find all prime numbers from 1 to n
  54.  ? Complexity : O[n * log(log(n))]
  55.  */
  56. vector<bool> isPrime(205, 1);
  57.  
  58. vector<int> primes;
  59.  
  60. vector<int> sieve(int n) {
  61. isPrime[0] = isPrime[1] = 0;
  62.  
  63. for (int i = 2; i * i <= n; i++) {
  64. if (isPrime[i]) {
  65. for (int j = i * i; j <= n; j += i)
  66. isPrime[j] = false;
  67. }
  68. }
  69. for (int i = 2; i < 163; i++) {
  70. if (isPrime[i]) primes.push_back(i);
  71. }
  72. return primes;
  73. }
  74.  
  75. int s = 0;
  76.  
  77. ll rec(int ind, int mod, int sum, bool greater, bool smaller) {
  78. if (ind == b.size()) {
  79. return mod == 0 && sum == s;
  80. }
  81. auto &res = dp[ind][mod][sum][greater][smaller];
  82. if (vis[ind][mod][sum][greater][smaller] == g)return res;
  83. vis[ind][mod][sum][greater][smaller] = g;
  84. res = 0;
  85. ll en = 9, st = 0;
  86. if (!greater)st = a[ind] - '0';
  87. if (!smaller)en = b[ind] - '0';
  88. for (ll i = st; i <= en; i++) {
  89. if (sum + i <= s)
  90. res += rec(ind + 1, (mod * 10 + i) % s, sum + i, greater || i > st, smaller || i < en);
  91. }
  92. return res;
  93. }
  94.  
  95.  
  96. void solve() {
  97. cin >> a >> b;
  98. while (a.size() < b.size()) {
  99. a = '0' + a;
  100. }
  101. ll sum = 0;
  102. for (int i = 0; i < primes.size(); i++) {
  103. g++;
  104. s = primes[i];
  105. sum += rec(0, 0, 0, 0, 0);
  106. }
  107. cout << sum << '\n';
  108. }
  109.  
  110. int main() {
  111. Bustany();
  112. sieve(200);
  113. ll t = 1;
  114. cin >> t;
  115. while (t--) {
  116. solve();
  117. }
  118. }
Success #stdin #stdout 0.01s 7744KB
stdin
Standard input is empty
stdout
0