Thursday 27 July 2017

Lightoj 1032 - Fast Bit Calculations

  1. #include <bits/stdc++.h>
  2. using namespace  std;
  3. #define ll long long int
  4. vector <int> bits;
  5. ll DP[35][2][2][35];
  6. ll dp(ll pos, ll prev,ll issmall,ll couple){
  7.     if(pos == bits.size()){
  8.         return couple;
  9.     }
  10.     if(DP[pos][prev][issmall][couple]!=-1){
  11.         return DP[pos][prev][issmall][couple];
  12.     }
  13.     ll ret = 0;
  14.     ll mx = 1;
  15.     if(!issmall) mx =  bits[pos];
  16.         for(int i = 0; i <=mx; i++){
  17.             ret+= dp(pos+1,i, (issmall|(i<bits[pos])),((prev==1 &&i==1)+ couple));
  18.         }
  19.         DP[pos][prev][issmall][couple] = ret;
  20.         return ret;
  21. }
  22. ll convert(ll n)
  23. {
  24.     bits.clear();
  25.     while(n!= 0){
  26.         bits.push_back(n%2);
  27.         n = n/2;
  28.     }
  29.     reverse(bits.begin(), bits.end());
  30.     return dp(0000);
  31. }
  32. int main()
  33. {
  34.     ll ts;
  35.     cin>>ts;
  36.     for(int i = 1; i <= ts; i++){
  37.     ll n;
  38.     cin>>n;
  39.     memset(DP, -1sizeof(DP));
  40.     ll ans = convert(n);
  41.     cout<<"Case "<<i<<": "<<ans<<endl;
  42.     }
  43.     return 0;
  44. }

4 comments:

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...