找规律即可,对于一个确定的k,输出所有的变变数,即可发现规律。
时间复杂度O(logB)
#include<bits/stdc++.h>
#define N 100010
#define inf 2147483647
#define ll long long
#define mem(a,b) memset(a,b,sizeof (a))
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
ll a,b,ans,k;
ll work(ll x)//0``x
{
if(x<k)return 0;
ll s=0,now=k,sum=0;
if(k&1)s=1;else s=2;
while(now + s <x)
{
sum+=s;
now=now*2;
s=s*2;
}
;
if(now>=x)return sum;
return sum + x - now +1;
}
int main()
{
open("chch");
scanf("%lld%lld%lld",&k,&a,&b);
if(k>b)
{
printf("0");
return 0;
}
if(k==0)
{
ans=b-a+1;
} else if(k==1) ans = b-a+1; else //ans=work(b) - work(a-1);
{
ans=work(b);
ll tmp=work(a-1);
ans-=tmp;
}
printf("%lld\n",ans);
return 0;
}