#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int dp[50][50];//dp[i][j]表示枚举到第i位,前面0的个数和1的个数差,为了防止中间出现dp[i][j]为负数但有可能是合法结果,此处hash一下,dp[i][j]+32
//最后判断结果是否>=32判断该方案是否合法
int digit[50];
int getvalue(int x)
{
int i=0;
while(x){
digit[i++]=x&1;
x=x>>1;
}
return dfs(pos-1,32,true,true);
}
int dfs(int pos,int state,bool lead,bool limit)//这里前导0有影响,要加上lead
{
if(pos==-1)return state>=32;
int up=limit?digit[pos]:1;
int ans=0;
for(int i=0;i<=up;i++){
if(i==0&&lead)ans+=dfs(pos-1,state,lead&&i==0,limit&&i==digit[pos]);//有前导0不计数
else ans+=dfs(pos-1,state+=(i==0)?1:0,lead&&i==0,limit&&i==digit[pos]);
}
if(!limit&&!lead)dp[pos][state]=ans;
return ans;
}
int main()
{
memset(dp,-1,sizeof(dp));
while(cin>>m>>n){
cout<<getvalue(n)-getvalue(m-1)<<endl;
}
return 0;
}
poj3252注意前导0的影响
最新推荐文章于 2020-02-11 10:20:38 发布