Guest User

Google Kickstart Round A Problem D

a guest
Mar 20th, 2022
512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #pragma GCC optimize("O3,unroll-loops")
  2. #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
  3.  
  4. #include <bits/stdc++.h>
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <ext/pb_ds/tree_policy.hpp>
  7. typedef long long ll;
  8. #define pb push_back
  9. #define ff first
  10. #define ss second
  11. const int N=3e5+7;
  12. const int mod=1e9+7;
  13. const double eps=1e-6;
  14. const double pi=    3.14159265358979323846;
  15. using namespace std;  
  16. using namespace __gnu_pbds;
  17. typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
  18.              tree_order_statistics_node_update>
  19.     op_set;
  20.  
  21. ll binpow(ll base, ll ex)
  22. {
  23.     ll ans=1;
  24.     while(ex>0)
  25.     {
  26.         if(ex%2==1)
  27.                 ans=ans*base;
  28.         base=base*base;
  29.         ex=ex/2;
  30.     }
  31.     return ans;
  32. }
  33.  
  34. ll dp[15][2][125][8][6][4][4][2][2];
  35. ll recursion(int pos,int small,int sum,int two,int three,int five,int seven,int zero,int start,string &curr)
  36. {
  37.     if(pos==curr.size())
  38.     {
  39.         ll formed=1ll;
  40.         formed=formed*binpow(2,two);
  41.         formed=formed*binpow(3,three);
  42.         formed=formed*binpow(5,five);
  43.         formed=formed*binpow(7,seven);
  44.         if(zero==1)
  45.                 formed=0;
  46.         if(start==1)
  47.             return 0ll;
  48.  
  49.         if(formed%sum==0)
  50.                 return 1ll;
  51.         return 0ll;
  52.     }
  53.  
  54.     ll &val=dp[pos][small][sum][two][three][five][seven][zero][start];
  55.     if(val!=-1)
  56.             return val;
  57.     val=0;
  58.  
  59.     if(start==1)
  60.             val+=recursion(pos+1,1,sum,two,three,five,seven,zero,1,curr);
  61.  
  62.     for(int i=start;i<10;i++)
  63.     {
  64.         int ntwo=two;
  65.         int nthree=three;
  66.         int nfive=five;
  67.         int nseven=seven;
  68.         int nzero=zero;
  69.         int nsum=sum+i;
  70.  
  71.         if(i==0)
  72.                 nzero=1;
  73.         else if(i==2)
  74.                 ntwo=std::min(ntwo+1,7);
  75.         else if(i==3)
  76.                 nthree=std::min(nthree+1,5);
  77.         else if(i==4)
  78.                 ntwo=std::min(ntwo+2,7);
  79.         else if(i==5)
  80.                 nfive=std::min(nfive+1,3);
  81.         else if(i==6)
  82.         {
  83.             nthree=std::min(nthree+1,5);
  84.             ntwo=std::min(ntwo+1,7);
  85.         }
  86.         else if(i==7)
  87.                 nseven=std::min(nseven+1,3);
  88.         else if(i==8)
  89.                 ntwo=std::min(ntwo+3,7);
  90.         else if(i==9)
  91.                 nthree=std::min(nthree+2,5);
  92.  
  93.         if(small || i<curr[pos]-'0')
  94.                 val+=recursion(pos+1,1,nsum,ntwo,nthree,nfive,nseven,nzero,0,curr);
  95.         else if(i==curr[pos]-'0')
  96.                 val+=recursion(pos+1,0,nsum,ntwo,nthree,nfive,nseven,nzero,0,curr);
  97.     }
  98.     return val;
  99. }
  100.  
  101. int32_t main()
  102. {
  103.    ios_base::sync_with_stdio(false);
  104.    cin.tie(0);
  105.  
  106.    int tc;
  107.    cin >> tc;
  108.    for(int t=1;t<=tc;t++)
  109.    {
  110.         cout << "Case #" << t << ": ";
  111.  
  112.         ll a,b;
  113.         cin >> a >> b;
  114.  
  115.         a--;
  116.  
  117.         string L=to_string(a);
  118.         string R=to_string(b);
  119.        
  120.         ll ans=0;
  121.         memset(dp,-1,sizeof(dp));
  122.         ans+=recursion(0,0,0,0,0,0,0,0,1,R);
  123.         memset(dp,-1,sizeof(dp));
  124.         ans-=recursion(0,0,0,0,0,0,0,0,1,L);
  125.        
  126.         cout << ans << "\n";
  127.    }
  128. }  
Advertisement
Add Comment
Please, Sign In to add comment