Tuesday, January 22, 2019

[UVa] 12208 - How Many Ones Needed?

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 12208 - How Many Ones Needed?
Source            : UVA Online Judge
Category          : Dynamic Programing
Algorithm         : Digit DP
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll            long long int  
  6.   
  7. ll dp[40][40];  
  8. bool memoize[40][40];  
  9. int a[40];  
  10.   
  11. inline ll solve(int pos, int one = 0, bool flag = 1, bool take = 0)  
  12. {  
  13.       if (pos < 0) return one;  
  14.       ll &ret = dp[pos][one];  
  15.       bool &mem = memoize[pos][one];  
  16.       if (!flag && take && mem) return ret;  
  17.       int loop = 1;  
  18.       if (flag) loop = a[pos];  
  19.       ll sum = 0;  
  20.       for (int i = 0; i <= loop; i++)  
  21.       {  
  22.             if (!take && i == 0) sum += solve(pos-1, 0, 0, 0);  
  23.             else sum += solve(pos-1, one + i, flag & i == a[pos], 1);  
  24.       }  
  25.       if (!flag && take) mem = 1, ret = sum;  
  26.       return sum;  
  27. }  
  28.   
  29. inline ll digitDP(ll num)  
  30. {  
  31.       if (num <= 0) return 0;  
  32.       int len = 0;  
  33.       while (num) a[len++] = num % 2, num /= 2;  
  34.       return solve(len-1);  
  35. }  
  36.   
  37. int main()  
  38. {  
  39.       ll a, b;  
  40.       int tcase = 1;  
  41.       while (cin >> a >> b)  
  42.       {  
  43.             if (a == 0 && b == 0) break;  
  44.             if (a > b) swap(a, b);  
  45.             ll tone = digitDP(b) - digitDP(a-1);  
  46.             cout << "Case " << tcase++ << ": " << tone << endl;  
  47.       }  
  48. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.