Advertisement
Guest User

Untitled

a guest
Sep 1st, 2014
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4. class TaroCoins {
  5. public:
  6.     long long getNumber(long long);
  7.     map<pair<ll,ll>,ll > dp;
  8.    
  9.     ll solve(ll n, ll maxpow){
  10.         if(n==0) return 1LL;
  11.         if(maxpow<0) return 0LL;
  12.         if( (1LL<<(maxpow+2)) < n) return 0LL;
  13.         ll& ref = dp[make_pair(n,maxpow)];
  14.         if(ref == 0){
  15.             ll subs = (1LL<<maxpow);
  16.             if(n-subs>=0) ref+=solve(n-subs, maxpow-1);
  17.             if(n-subs-subs>=0) ref+=solve(n-subs-subs, maxpow-1);
  18.             ref+=solve(n, maxpow-1);
  19.         }
  20.         return ref;
  21.     }
  22. };
  23.  
  24. long long TaroCoins::getNumber(long long N) {
  25.     ll startWithMe = 1;
  26.     ll pow2 = 0;
  27.     while(true) {
  28.         if(startWithMe*2 > N) break;
  29.         startWithMe *= 2;
  30.         ++pow2;
  31.     }
  32.     return solve(N,pow2);
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement