输入数据:
1 3538953
正确输出:
1760693
我的输出:
1760692
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l,r;
ll f[154];
ll c[154][154];
ll op[154],gen[154];
ll res,len;
ll w[154],t[154];
inline void init()
{
c[0][1]=1;c[1][1]=1;
for(int i=2;i<=94;i++)
{
c[0][i]=1;
for(int j=1;j<=i;j++)
c[j][i]=c[j-1][i-1]+c[j][i-1];
}
for(int i=1;i<=94;i++)
for(int j=i;j>=(i+1)/2;j--)
op[i]+=c[j][i];
for(int i=1;i<=94;i++)
{
for(int j=i-1;j>=(i+1)/2;j--)
gen[i]+=c[j][i-1];
gen[i]+=gen[i-1];
}
//cout<<gen[3];
}
inline ll S(ll x)
{
if(x==0)
return 0;
len=0;
ll a=x;
ll ans=0;
res=0;
//cout<<a<<' ';
while(a)
{
//cout<<a<<' ';
len++;
if(a&1)
w[len]=1;
else
w[len]=0;
a/=2;
}
ans+=gen[len-1];
//res++;
for(int i=1;i<=len;i++)
{
t[i]=w[len-i+1];
//cout<<t[i]<<' ';
}
/* cout<<'\n';
cout<<len<<' ';
cout<<ans<<'\n';*/
for(int i=2;i<=len;i++)
{
if(t[i])
{
for(int j=len-i;j>=max(0ll,(len+1)/2-res-1);j--)
ans+=c[j][len-i];
//cout<<i<<' '<<len-i<<' '<<res<<' '<<ans<<'\n';
}
else
res++;
}
///cout<<res<<' '<<(len+1)/2<<'\n';
if(res>=(len+1)/2)
ans++;
return ans;
}
int main()
{
init();
cin>>l>>r;
cout<<S(r)-S(l-1);
return 0;
}