组合数学的题目。
公式自己推,注意边界条件。
#include <iostream>
#include <cstdio>#include <cstring>
using namespace std;
const int maxn=101;
int a[maxn];
long long cal(int a,int b)
{
if(b>a-b) b=a-b;
long long ans=1;
int m=b;
for(int i=a;i>a-b;i--)
{
ans*=i;
// printf("%lld\n",ans);
while(ans%m==0&&m>1)
ans/=m--;
}
return(ans);
}
long long work(int n)
{
long long ans=0;
int tt=0;
while(n)
{
a[++tt]=n%2;
n/=2;
}
for(int i=1;i<tt;i++)
{
for(int j=(i-1)/2+1;j<i;j++)
ans+=cal(i-1,j);
}
int c[2]={0,1};
int sum=tt/2;
if(tt&1) sum++;
for(int i=tt-1;i>=1;i--)
{
if(a[i]==1)
{
for(int j=max(sum-1-c[0],0);j<i;j++)
ans+=cal(i-1,j);
}
c[a[i]]++;
}
return(ans);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
// for(int i=1;i<=100;i++)
// work(i+1);
// printf("%d %lld\n",i,work(i+1));
printf("%lld\n",work(m+1)-work(n));
return 0;
}