DuongNhi99

C - 369 Numbers (15-12)

Dec 14th, 2020 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int mod = 1000000007LL;
  5.  
  6. long long dp[52][3][18][18][18];
  7. vector <int> digit;
  8.  
  9. void getdigit(string x){
  10.     digit.clear();
  11.     for(int i = x.size() - 1; i >= 0; i--)
  12.         digit.push_back(x[i] - '0');
  13. }
  14.  
  15. long long getnum(int id, int tight, int n3, int n6, int n9){
  16.     if(id == -1)
  17.         return (n3 == n6 && n3 == n9 && n3 != 0);
  18.  
  19.     if(n3 > 16 || n6 > 16 || n9 > 16)
  20.         return 0;
  21.  
  22.     if(dp[id][tight][n3][n6][n9] > -1 && tight == 0)
  23.         return dp[id][tight][n3][n6][n9];
  24.  
  25.     int k = (tight == 0) ? 9 : digit[id];
  26.     long long sum = 0;
  27.  
  28.     for(int i = 0; i <= k; i++){
  29.         int newt = (digit[id] == i) ? tight : 0;
  30.         sum = (sum + getnum(id - 1, newt, n3 + (i == 3), n6 + (i == 6), n9 + (i == 9))) % mod;
  31.     }
  32.  
  33.     if(tight == 0)
  34.         dp[id][tight][n3][n6][n9] = sum % mod;
  35.  
  36.     return sum % mod;
  37. }
  38.  
  39. long long query(string l, string r){
  40.     getdigit(l);
  41.     long long a = getnum(digit.size() - 1, 1, 0, 0, 0);
  42.  
  43.     getdigit(r);
  44.     long long b = getnum(digit.size() - 1, 1, 0, 0, 0);
  45.  
  46.     int n3 = 0, n6 = 0, n9 = 0;
  47.     for(int i = 0; i < l.size(); i++){
  48.         if(l[i] - '3' == 0)
  49.             n3++;
  50.         else if(l[i] - '6' == 0)
  51.             n6++;
  52.         else if(l[i] - '9' == 0)
  53.             n9++;
  54.     }
  55.  
  56.     return (b - a + (n3 == n6 && n3 == n9 && n3 > 0) + mod) % mod;
  57. }
  58.  
  59. int t;
  60. string l, r;
  61.  
  62. int main(){
  63.     cin >> t;
  64.     memset(dp, -1, sizeof(dp));
  65.     while(t--){
  66.         cin >> l >> r;
  67.         cout << query(l, r) << '\n';
  68.     }
  69. }
  70.  
Advertisement
Add Comment
Please, Sign In to add comment