一开始,想不到应该怎么记录状态,看了一下题解,
f[pos][num0][num1],记录了位置,0的数量,1的数量, 但1001,1100的pos,num0,num1都是相同的,为什么可以呢,代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define ll long long
using namespace std;
int cnt,c[101],f[101][101][101];
ll l,r;
ll dfs(int pos,int sum0,int sum1,bool lead,bool limit) {
if(pos>cnt) {
if(lead||sum0>=sum1) return 1;
else return 0;
}
if(!lead&&!limit&&f[pos][sum0][sum1]!=-1) return f[pos][sum0][sum1];
int up=limit?c[cnt-pos+1]:1;
ll s=0;
for(int i=0;i<=up;i++)
if(i==0&&lead) s+=dfs(pos+1,0,0,1,limit&&(i==up));
else s+=dfs(pos+1,sum0+(i==0),sum1+(i==1),lead&&(i==0),limit&&(i==up));
if(!lead&&!limit) f[pos][sum0][sum1]=s;
return s;
}
ll cl(ll x) {
cnt=0;
while(x) {
c[++cnt]=x&1;
x>>=1;
}
memset(f,-1,sizeof(f));
return dfs(1,0,0,1,1);
}
int main() {
scanf("%lld%lld",&l,&r);
printf("%lld\n",cl(r)-cl(l-1));
return 0;
}