RT。。。70感觉和暴力一个分了。
#include <bits/stdc++.h>
using namespace std;
#define M 105
#define int long long
int n,m,g[M],h[M],L,f[M][M];
int Sol(int now,int k,int s1,int s0,int lst)
//now表示现在到了第i位,k为前面是不是全顶格了11
//s1表示现在有s1个1,s0表示现在有s0个1,lst表示第一个1前面有多少个前导零
{
if(now>L) return ((s0-lst)>=s1); if(!k&&!lst&&f[now][s1-s0+M-50]!=-1) return f[now][s1-s0+M-50];
int H=(k?h[now]:1),res=0;
for(int i=0;i<=H;i++)
{
res+=Sol(now+1,k&&(i==H),s1+i,s0+(!i),((s1+i)==0?lst+1:lst));
}
if(!k&&!lst) f[now][s1-s0+M-50]=res;
return res;
/*
[1][0][0][0]
1 1 0 0 0 1
*/
}
signed Get(int y)
{
L=0;memset(h,0,sizeof(h));memset(f,-1,sizeof(f));//初始化
while(y) h[++L]=y%2,y>>=1;reverse(h+1,h+1+L);//转二进制
// for(int i=1;i<=L;i++) cout<<h[i]; cout<<endl;
return Sol(1,1,0,0,0);
}
int main()
{
cin>>n>>m;
cout<<Get(m)-Get(n-1);
return 0;
}