LightOJ-1032-Fast Bit Calculations

Source: Internet
Author: User

A bit is a binary digit, taking a logical value of either1Or0(Also referred to as "true" or "false" respectively). And every decimal number has a binary representation which is actually a series of bits. If a bit of a number is1And its next bit is also1Then we can say that the number has1Adjacent bit. And you have to find out how many times this scenario occurs for all numbers upN.

Examples:

Number Binary Adjacent Bits

12 1100 1

15 1111 3

27 11011 2

Input

Input starts with an integerT (≤ 10000), Denoting the number of test cases.

Each case contains an integerN (0 ≤ N <231).

Output

For each test case, print the case number and the summation of all adjacent bits from0ToN.

Sample Input Output for Sample Input

7

0

6

15

20

21

22

2147483647

Case 1: 0

Case 2: 2

Case 3: 12

Case 4: 13

Case 5: 13

Case 6: 14

Case 7: 16106127360

Similar to 1140



#include 
 
  #include 
  
   #include 
   
    #include 
    
     using namespace std;typedef long long ll;vector
     
       digit;int n;ll pow2[32];ll dp[32][2];ll getSum(int pos){    ll res = 0;    for(int i = pos; i >= 0; i--){        res *= 2;        res += digit[i];    }    return res+1;}ll dfs(int pos,int pre,int zero,int done){    if(pos==-1) return 0;    if(!zero && !done && ~dp[pos][pre]) return dp[pos][pre];    ll res = 0;    int end = done?digit[pos]:1;    for(int i = 0; i <= end; i++){        if(pre==1&&i==1){            if(done&&i==end){                res += getSum(pos-1);            }else{                res += pow2[pos];            }        }        res += dfs(pos-1,i,zero&&i==0,done&&i==end);    }    if(!done && !zero) dp[pos][pre] = res;    return res;}ll solve(ll x){    digit.clear();    while(x){        digit.push_back(x%2);        x /= 2;    }    return dfs(digit.size()-1,0,1,1);}void init(){    pow2[0] = 1;    for(int i = 1; i <= 31; i++){        pow2[i] = pow2[i-1]*2;    }    memset(dp,-1,sizeof dp);}int main(){    int ncase,T=1;    cin >> ncase;    init();    while(ncase--){        cin >> n;        printf("Case %d: %lld\n",T++,solve(n));    }    return 0;}
     
    
   
  
 


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.