转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1301472836
题目很好玩,搞了半天搞不定只能看大神的解题报告,先dp打表,然后分类累加
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
int c[40][40]={0};
int bin[40];
void getc()
{
int i,j;
//c[0][1]=c[0][0]=1;
for (i=0;i<33;i++)
for (j=0;j<=i;j++)
{
if (!j||i==j) c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
}
// c[0][0]=0;
return;
}
void getbin(int n)
{
bin[0]=0;
while (n)
{
bin[++bin[0]]=n%2;
n/=2;
}
//cout<<bin[0]<<endl;
return ;
}
int round(int n)
{
getbin(n);
if (!bin[0]) return 0;
int zero=0;
int sum=0;
int i,j;
for (i=1;i<bin[0];i++)
for (j=(i+1)/2;j<=i-1;j++)
sum+=c[i-1][j];
for (i=bin[0]-1;i>0;i--)
{
if (bin[i])
{
for (j=(bin[0]+1)/2-1-zero;j<=i-1;j++)
sum+=c[i-1][j];
}
else zero++;
}
//cout<<zero<<endl;
return sum;
}
int main()
{
getc();
int a,b;
while (cin>>a>>b)
{
//cout<<round(a-1)<<endl;
cout<<round(b+1)-round(a)<<endl;
}
return 0;
}