题意:求A+.....+B中二进制进位次数
逢二进一
[A,B]中统计每一位1的个数 num[i],而后从低位到高位 统计
ans=sigma ( ( num[i]+ num[i-1]/2 )/2); //第i位加上 上一位进位的个数 除二
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <climits>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#include <queue>
#define LL long long
LL solve(LL x,LL y)
{
LL num[111];
memset(num,0,sizeof(num));
for(LL i=0,l=2;i<32;i++,l*=2)
{
num[i]=x/l*(l/2);
if(x%l>=l/2)
num[i]+=(x%l)-l/2;
}
for(LL i=0,l=2;i<32;i++,l*=2)
{
num[i]-=y/l*(l/2);
if(y%l>=l/2)
num[i]-=((y%l)-l/2);
}
// for(int i=0;i<33;i++)
// printf("%d ",num[i]);
// printf("\n");
LL ans=0;
for(LL i=0;i<=64;i++)//要知道num[i]为0
{
ans+=num[i]/2;
num[i+1]+=num[i]/2;
}
return ans;
}
int main()
{
LL a,b;
while(cin>>a>>b)
{
LL ans=solve(b+1,a);
cout<<ans<<endl;
}
return 0;
}