fork(1) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define all(a) a.begin(), a.end()
  6.  
  7. string target;
  8. int dp[20][165][1460]; //Another trick, you can remove 'sm' dimension
  9. bool prime[1460];
  10.  
  11. int recur(int pos, bool sm=0, int dsum=0, int dsqsum=0){
  12. if(pos==-1) return (prime[dsum] and prime[dsqsum]);
  13.  
  14. int& res = dp[pos][dsum][dsqsum];
  15. if(sm && res != -1) return res;
  16.  
  17. int lim = sm?9:target[pos]-'0', ans = 0;
  18. for(int d = 0; d <= lim; d++)
  19. ans+=recur(pos-1,sm or d!=lim, dsum+d, dsqsum+d*d);
  20. return sm ? res = ans : ans;
  21. }
  22.  
  23. bool isprime(int x){
  24. for(int i = 2; i*i<=x; i++)
  25. if(x%i==0) return false;
  26. return true;
  27. }
  28.  
  29. int32_t main()
  30. {
  31. memset(dp, -1, sizeof(dp));
  32. for(int i = 2; i < 1460; i++) prime[i]=isprime(i);
  33. int t; cin >> t;
  34. while(t--){
  35. int l, r; cin >> l >> r;
  36. target = to_string(r); reverse(all(target));
  37. int tot = recur((int)target.size()-1);
  38. target = to_string(l-1); reverse(all(target));
  39. cout << tot-recur((int)target.size()-1) << "\n";
  40. }
  41. }
Success #stdin #stdout 0.02s 41320KB
stdin
10
1 10
10 20
20 30
57 73
30 300
100 100000
5000 50000
4556 24324324
10000 31324312432441
1 1000000000000000000
stdout
0
4
3
3
46
9697
4799
2197282
2358550564231
65931412787268351