Advertisement
Saleh127

Light OJ 1068 / Digit DP

Sep 7th, 2022
748
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. /***
  2.  created: 2022-09-07-23.20.28
  3. ***/
  4.  
  5. #include <bits/stdc++.h>
  6. #include <ext/pb_ds/assoc_container.hpp>
  7. #include <ext/pb_ds/tree_policy.hpp>
  8. using namespace std;
  9. using namespace __gnu_pbds;
  10. template<typename U> using ordered_set=tree<U, null_type,less<U>,rb_tree_tag,tree_order_statistics_node_update>;
  11. #define ll long long
  12. #define test int tt; cin>>tt; for(int cs=1;cs<=tt;cs++)
  13. #define get_lost_idiot return 0
  14. #define nl '\n'
  15.  
  16. ll dp[12][100][100][3],k;
  17.  
  18. vector<ll>digit;
  19.  
  20. ll solve(ll in,ll sum,ll num, bool f)
  21. {
  22.     if(in==digit.size())
  23.     {
  24.         if (sum%k==0 && num%k==0) return 1;
  25.         else return 0;
  26.     }
  27.  
  28.     if(dp[in][sum][num][f]!=-1) return dp[in][sum][num][f];
  29.  
  30.     ll ans=0;
  31.  
  32.     ll lim;
  33.  
  34.     if(f) lim=9;
  35.     else lim=digit[in];
  36.  
  37.     for(ll i=0;i<lim;i++)
  38.     {
  39.         ans+=solve(in+1,(sum+i),(num*10 + i)%k, 1);
  40.     }
  41.  
  42.     ans+=solve(in+1,(sum+lim),(num*10 + lim)%k, f);
  43.  
  44.     return dp[in][sum][num][f]=ans;
  45. }
  46.  
  47. int main()
  48. {
  49.     ios_base::sync_with_stdio(0);
  50.     cin.tie(0);
  51.     cout.tie(0);
  52.  
  53.  
  54.     test
  55.     {
  56.         ll n,m,i,a,b,ans;
  57.  
  58.         cin>>a>>b>>k;
  59.  
  60.         if(k>=99)
  61.         {
  62.             cout<<"Case "<<cs<<": "<<0<<nl;
  63.             continue;
  64.         }
  65.  
  66.  
  67.         digit.clear();
  68.         memset(dp,-1,sizeof dp);
  69.         while(b)
  70.         {
  71.             digit.push_back(b%10);
  72.             b/=10;
  73.         }
  74.         reverse(digit.begin(),digit.end());
  75.  
  76.  
  77.         ans=solve(0,0,0,0);
  78.  
  79.  
  80.         digit.clear();
  81.         memset(dp,-1,sizeof dp);
  82.         a-=1;
  83.         while(a)
  84.         {
  85.             digit.push_back(a%10);
  86.             a/=10;
  87.         }
  88.         reverse(digit.begin(),digit.end());
  89.  
  90.  
  91.         ans = ans - solve(0,0,0,0);
  92.  
  93.         cout<<"Case "<<cs<<": "<<ans<<nl;
  94.     }
  95.  
  96.  
  97.     get_lost_idiot;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement