Advertisement
shamiul93

1068 - Investigation

Jun 18th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. /**
  2. Problem - 1068 - Investigation
  3. Concept - Digit DP
  4. Idea - easy. See previously solved problems.
  5. **/
  6.  
  7. // LightOJ always needs this format for sure..so I made a copy of it...
  8. #include <bits/stdc++.h>
  9. #include<vector>
  10. #define ll                                      long long int
  11. #define fi                                      freopen("in.txt", "r", stdin)
  12. #define fo                                      freopen("out.txt", "w", stdout)
  13. #define m0(a) memset(a , 0 , sizeof(a))
  14. #define m1(a) memset(a , -1 , sizeof(a))
  15. #define inf LLONG_MAX
  16. #define min3(a,b,c) min(a,min(b,c))
  17. #define max3(a,b,c) max(a,max(b,c))
  18. #define ones(mask)  __builtin_popcount(mask) /// __builtin_popcount : it's a built in function of GCC. Finds out the numbers of 1 in binary representation.
  19. #define mx 150000
  20.  
  21. using namespace std;
  22.  
  23. ll a, b, k, len ;
  24. ll dp[70][2][70][70] ;
  25. bool vis[70][2][70][70] ;
  26.  
  27. vector<ll> v ;
  28.  
  29. ll solve(ll pos, ll prevSmall, ll numRem, ll remDigit)
  30. {
  31.     if(pos >= len)
  32.     {
  33.         if( numRem == 0 && remDigit == 0 )
  34.         {
  35.             vis[pos][prevSmall][numRem][remDigit] = true ;
  36.             return dp[pos][prevSmall][numRem][remDigit] = 1 ;
  37.         }
  38.         else
  39.         {
  40.             vis[pos][prevSmall][numRem][remDigit] = true ;
  41.             return dp[pos][prevSmall][numRem][remDigit] = 0 ;
  42.         }
  43.     }
  44.     if(vis[pos][prevSmall][numRem][remDigit])
  45.     {
  46.         return dp[pos][prevSmall][numRem][remDigit] ;
  47.     }
  48.  
  49.     ll ret = 0 ;
  50.  
  51.     ll bestPossible ;
  52.     bestPossible = (prevSmall) ? 9 : v[pos] ;
  53.  
  54.     for(ll i = 0 ; i <= bestPossible ; i++)
  55.     {
  56.         ret += solve(pos+1, prevSmall | (i < v[pos]), (numRem*10 + i) % k, (remDigit + i) % k) ;
  57.     }
  58.  
  59.     vis[pos][prevSmall][numRem][remDigit] = true ;
  60.     return dp[pos][prevSmall][numRem][remDigit] = ret ;
  61. }
  62.  
  63. ll calc(ll N)
  64. {
  65.     if(k > 90) return 0 ;
  66.     for(ll i = 0 ; i < 70 ; i++)
  67.     {
  68.         for(ll j = 0 ; j < 2 ; j++)
  69.         {
  70.             for(ll k = 0 ; k < 70 ; k++)
  71.             {
  72.                 for(ll l = 0 ; l < 70 ; l++)
  73.                 {
  74.                     vis[i][j][k][l] = false ;
  75.                 }
  76.             }
  77.         }
  78.     }
  79.  
  80.     v.clear() ;
  81.  
  82.     while(N)
  83.     {
  84.         ll d ;
  85.         d = N % 10 ;
  86.         v.push_back(d) ;
  87.         N = N / 10 ;
  88.     }
  89.     len = v.size() ;
  90.     reverse(v.begin(), v.end()) ;
  91.  
  92.     return solve(0, 0, 0, 0) ;
  93. }
  94.  
  95. int main()
  96. {
  97.     ll T, t = 0 ;
  98.     scanf("%lld",&T) ;
  99.  
  100.     while(T--)
  101.     {
  102.         t++ ;
  103.  
  104.         scanf("%lld %lld %lld",&a, &b, &k) ;
  105.  
  106.         ll ans ;
  107.         ans = calc(b) - calc(a-1) ;
  108.  
  109.  
  110.         printf("Case %lld: ",t) ;
  111.         printf("%lld\n",ans) ;
  112.     }
  113.     return 0 ;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement