Guest User

Untitled

a guest
Jan 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <map>
  4. #include <cmath>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8.  
  9.  
  10. typedef long long Integer;
  11. const Integer LIMIT = 6350;
  12. Integer K, A, B;
  13. int P, Q, k;
  14. map<Integer, Integer> *cache[12][100];
  15. inline void clear(){ for (int i = 0 ; i < 12; ++i) for (int j = 0; j < 100; ++j) for (int s = 0; s < k; ++s) cache[i][j][s].clear(); }
  16. inline int MAX(int a, int b) { return a  >b ? a : b; }
  17. inline int MIN(int a, int b) { return a < b ? a : b; }
  18. inline int ssss(Integer a) {int total = 0;while(a) { total += a % 10; a /= 10; } return total; }
  19. inline int length1(Integer a) { int total = 0; while (a) { ++total; a /= 10; } return total; }
  20. Integer POWERS[15];
  21.  
  22.  
  23.  
  24. inline Integer doIt(int length, int sum, int r, Integer u) {
  25.     if (length == 1) {
  26.         return (long long)sum <= u && (sum + r) % k == 0;
  27.     }
  28.    
  29.     if (cache[length][sum][r].count(u) ) {
  30.         return cache[length][sum][r][u];
  31.     }
  32.     int prevSum = MAX( MAX(sum - 9, 0), sum - (int) (u / POWERS[length - 1]));
  33.     Integer result = 0;
  34.     result += doIt(length - 1, prevSum, ( POWERS[length - 1] * (sum - prevSum) + r) % k, u % POWERS[length - 1]);
  35.     int maxSum = MIN((length - 1) * 9, sum);
  36.     ++prevSum;
  37.     for (; prevSum <= maxSum; ++prevSum) {
  38.         result += doIt(length - 1, prevSum, (POWERS[length - 1] * (sum - prevSum) + r ) % k, POWERS[length - 1] - 1);
  39.     }
  40.     return cache[length][sum][r][u] = result;
  41. }
  42.  
  43.  
  44. inline Integer go(Integer to) {
  45.     clear();
  46.     int length = length1(to);
  47.     Integer result = 0;
  48.     int upper = MIN(9 * length, Q);
  49.     for (; upper >= P; --upper) result += doIt(length, upper, 0, to);
  50.     return result;     
  51. }
  52.  
  53. inline Integer triv() {
  54.     Integer starter = (A - 1) / K + 1;
  55.     starter  *= K;
  56.     Integer result = 0;
  57.     for (; starter <= B; starter += K) {
  58.         int now = ssss(starter);
  59.         result += now >= P && now <= Q;
  60.     }
  61.     return result;
  62. }
  63. int main() {
  64.     freopen("lucky.in", "r", stdin);
  65.     freopen("lucky.out", "w", stdout);
  66.     cin >> K >> P >> Q >> A >> B;
  67.     Integer lim = (Integer)sqrt(B + .0);
  68.     if (K  > lim / 50) {
  69.         cout << triv();
  70.         return 0;
  71.     }
  72.     POWERS[0] = 1;
  73.     //for (int i = 0; i < M; i++) digsum[i] = i % 10 + digsum[i / 10];
  74.     for (int i = 1; i < 15; ++i) POWERS[i] = POWERS[i - 1] * 10;
  75.     k = (int) K;
  76.     for (int i = 0; i < 12; ++i) for (int j = 0; j < 100; ++j) { cache[i][j] = new map<Integer, Integer> [k]; }
  77.     cout << (go(B) - go(A - 1));
  78.     return 0;
  79. }
Add Comment
Please, Sign In to add comment