注释为详解

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
#define N 200000
#include<math.h>
#include<queue>
using namespace std;
int a,b;
int yanghui[35][35]={0};///杨辉三角
int  s[35];///   二进制存储数组
int ans_weishu(int n){
int ans=0;
int t=n/2;///可以在第一位之后放几个‘1’
for(int i=0;i<t;i++){/// 因为第一位已经有'1'了所以是小于t
    ans+=yanghui[n-1][i];
}
return ans;
}
int run(int t){
    int n=t;
    if(n==0)return 0;
    if(n==1)return 0;
    if(n==2)return 1;
int ans=0,pos=0;
while(n){///转化二进制
    s[pos++]=(n%2);
    n>>=1;
}
///此时pos记录的是该二进制数字的长度
for(int i=pos-1;i>=2;--i){///将
    ans+=ans_weishu(i);
}
int fangzhi=pos/2;///   最多可以放置几个‘1’
for(int i=pos-2;i>=0;--i){///我们从倒数第二位开始统计谁是‘1’
    if(s[i]==1){
        for(int j=0;j<=fangzhi-1;j++){///是‘1’的话
            ans+=yanghui[i][j];///举个例子  1110的话  a.10_ _所有符合+b.110 _符合
        }                 ///1111   10_ _ +110_ +1110
        --fangzhi;///再向下寻找的话前面已经多占一个'1'所以'放置数--';
    }
}
int cnt=0;
for(int i=pos-1;i>=0;--i){///  计算该数字是不是'0'多的数字
    if(s[i]==1){
        cnt++;
    }
}
if(cnt<=(pos/2)){ans+=1;}
return ans;
}
int main(){
freopen("input2.txt","r",stdin);
yanghui[1][1]=yanghui[1][0]=1;
for(int i=2;i<34;++i){
    for(int j=0;j<=i;++j){
        yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
    }
}
yanghui[0][0]=1;///   这里是最后一位时候如输入是3->11  则10也要计数
cin>>a>>b;
cout<<(run(b)-run(a-1))<<endl;///因为run得到的结果是[0,n]的答案  所以a-1
return 0;
}

 

10-03 21:38