Monday, April 8, 2019

[Codeforces] D. Random Task

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : D. Random Task
Source            : Codeforces
Category          : Dynamic Programing, Search
Algorithm         : Digit DP, Binary Search
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll            long long int  
  6.   
  7. ll dp[70][70];  
  8. bool memoize[70][70];  
  9. int a[70];  
  10.   
  11. ll m, k;  
  12.   
  13. ll solve(int pos, int one = 0, bool flag = 1, bool take = 0)  
  14. {  
  15.       if (pos < 0) return one == k;  
  16.       ll &ret = dp[pos][one];  
  17.       bool &mem = memoize[pos][one];  
  18.       if (!flag && take && mem) return ret;  
  19.       int loop = 1;  
  20.       if (flag) loop = a[pos];  
  21.       ll sum = 0;  
  22.       for (int i = 0; i <= loop; i++)  
  23.       {  
  24.             if (!take && i == 0) sum += solve(pos-1, 0, 0, 0);  
  25.             else sum += solve(pos-1, one + i, flag & i == a[pos], 1);  
  26.       }  
  27.       if (!flag && take) mem = 1, ret = sum;  
  28.       return sum;  
  29. }  
  30.   
  31. ll digit_dp(ll num)  
  32. {  
  33.       int len = 0;  
  34.       while (num) a[len++] = num % 2, num /= 2;  
  35.       return solve(len-1);  
  36. }  
  37.   
  38. int main()  
  39. {  
  40.       ios_base::sync_with_stdio(false);  
  41.       cin.tie(NULL);  
  42.       cout << fixed << setprecision(15);  
  43.       #ifndef ONLINE_JUDGE  
  44.             freopen("in.txt""r", stdin);  
  45.       #endif // ONLINE_JUDGE  
  46.   
  47.       cin >> m >> k;  
  48.       ll lo = 1;  
  49.       ll hi = 1e18;  
  50.       ll ans = -1;  
  51.       while (lo <= hi)  
  52.       {  
  53.             ll mid = lo + (hi - lo) / 2;  
  54.             ll cnt = digit_dp(mid*2) - digit_dp(mid);  
  55.             if (cnt == m)  
  56.             {  
  57.                   ans = mid;  
  58.                   hi = mid - 1;  
  59.             }  
  60.             else if (cnt < m) lo = mid + 1;  
  61.             else hi = mid - 1;  
  62.       }  
  63.       assert(ans != -1);  
  64.       cout << ans;  
  65. }  

No comments:

Post a Comment

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