题目链接:
http://poj.org/problem?id=3252
一开始我也没想到好的方法,看了大牛的博客才A的。。
http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122758.html
感觉已经讲的很清楚了=,= 我这么蠢的人都看懂了。。
#include<stdio.h>
#include<string.h>
int a[35][35]={0};
int num[35];
void solve(void)
{
for(int i=0;i<=32;i++)
for(int j=0;j<=i;j++)
{
if(i==j || !j)
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
return ;
}
void dec(int n)
{
num[0]=0;
while(n)
{
num[++num[0]]=n%2;
n/=2;
}
return;
}
int Cnt(int n)
{
int i,j;
dec(n);
int zero=0;
int sum=0;
for(i=1;i<num[0]-1;i++)
for(j=i/2+1;j<=i;j++)
sum+=a[i][j];
for(i=num[0]-1;i>=1;i--)
{
if(num[i])
for(j=(num[0]+1)/2-(zero+1);j<=i-1;j++)
sum+=a[i-1][j];
else zero++;
}
return sum;
}
int main()
{
solve();
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",Cnt(b+1)-Cnt(a));
return 0;
}