排列组合。。。
做了好久
#include<cstdio>
using namespace std;
typedef long long ll;
ll a,b,ans;
int stack[100],top;
ll c(int n,int m)
{
if(m==0)
{
return 1;
}
ll max=1;
ll min=1;
if(m>n-m)
m=n-m;
while(m>0)
{
max*=n--;
min*=m--;
}
return max/min;
}
void init(ll x)
{
top=0;
while(x)
{
if(x%2)
{
stack[top++]=1;
}
else
{
stack[top++]=0;
}
x/=2;
}
}
ll lb(int n0,int n1,int p) //0有n0个 1有n1个 可选择0~p
{
ll sum=0;
int i;
for(i=0;i<=p;i++)
{
if(n0+i>=n1+p-i)
{
sum+=c(p,i);
}
}
return sum;
}
ll fun(ll x,bool &ba)
{
init(x);
int i,n0,n1;
n0=n1=0;
ll sum=0;
while(top)
{
top--;
if(stack[top]==1)
{
n1++;
if(n1+n0==1)
{
for(i=1;i<top;i++)
{
sum+=lb(0,1,i);
}
}
else
{
sum+=lb(n0+1,n1-1,top);
}
}
else
{
n0++;
}
}
if(n0>=n1)
{
sum++;
ba=true;
}
return sum;
}
void cal()
{
bool ba,bb;
ans=fun(b,bb)-fun(a,ba);
if(ba)
{
ans++;
}
}
void answer()
{
printf("%lld\n",ans);
}
int main()
{
while(~scanf("%lld%lld",&a,&b))
{
cal();
answer();
}
return 0;
}