题目:NJUST 1739 - Count The Carries
思路:用一个30位左右的数组,记录一下从0~n中各位出现1的频率,然后递推累加上去,就搞定了
这里 鄙视一下小胖(竟然说数据太大了搞不出来) = =
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
long long num[101];
long long a,b;
void solve()
{
memset(num,0,sizeof(num));
long long p=2;
b++;
for(int i=1;i<=30;i++)
{
num[i]+=b/p*(p/2);
int remain=b%p;
if(remain<=p/2)
;
else
num[i]+=remain-p/2;
p*=2;
}
p=2;
for(int i=1;i<=30;i++)
{
num[i]-=a/p*(p/2);
int remain=a%p;
if(remain<=p/2)
;
else
num[i]-=remain-p/2;
p*=2;
}
long long sy=0;
for(int i=1;i<=100;i++)
{
sy+=num[i]/2;
num[i+1]+=num[i]/2;
}
printf("%lld\n",sy);
return ;
}
int main()
{
while(scanf("%lld%lld",&a,&b)!=EOF)
{
solve();
}
return 0;
}