DuongNhi99

F - X mod f(x) (15-12)

Dec 15th, 2020 (edited)
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>
  4.  
  5. #define int64_t long long
  6. using namespace std;
  7.  
  8. int L, R;
  9. int dp[11][82][82][82];
  10. vector<int> digit;
  11.  
  12. int getNum(int pos, int mod, int sum, int digmod, bool limit) {
  13.     if(pos == -1)
  14.         return sum == mod && digmod == 0;
  15.  
  16.     if(dp[pos][mod][sum][digmod] != -1 && !limit)
  17.         return dp[pos][mod][sum][digmod];
  18.  
  19.     int res = 0;
  20.  
  21.     for(int i = 0; i <= 9; ++i) {
  22.         if(limit && i > digit[pos]) break;
  23.  
  24.         int newLimit = limit && i == digit[pos];
  25.         res += getNum(pos - 1, mod, sum + i, (digmod*10+i) % mod, newLimit);
  26.     }
  27.  
  28.     if(!limit)
  29.         dp[pos][mod][sum][digmod] = res;
  30.  
  31.     return res;
  32. }
  33.  
  34. int64_t solve(int x) {
  35.     digit.clear();
  36.     while(x) {
  37.         digit.push_back(x % 10);
  38.         x /= 10;
  39.     }
  40.  
  41.     int64_t ans = 0;
  42.     for(int i = 1; i <= 81; ++i)
  43.         ans += getNum(digit.size() - 1, i, 0, 0, true);
  44.  
  45.     return ans;
  46. }
  47.  
  48. int main() {
  49. #ifdef DN
  50.     //freopen("in.txt", "r", stdin);
  51. #endif
  52.     //freopen("F-X mod f(x).inp", "r", stdin);
  53.     //freopen("F-X mod f(x).out", "w", stdout);
  54.     ios_base::sync_with_stdio(false);
  55.     cin.tie(NULL); cout.tie(NULL);
  56.  
  57.     int t; cin >> t;
  58.     memset(dp, -1, sizeof(dp));
  59.     for(int i = 1; i <= t; ++i) {
  60.         cin >> L >> R;
  61.  
  62.         cout << "Case " << i << ": " << solve(R) - solve(L - 1) << '\n';
  63.     }
  64.  
  65.     return 0;
  66. }
  67.  
Advertisement
Add Comment
Please, Sign In to add comment