求调
查看原帖
求调
800499
suzhikz楼主2023/9/6 21:27
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<queue>
#include<vector>
#include<stdio.h>
//#include<map>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<bitset>
using namespace std;
int l,r;
int dp[45][45];//i位数中0的个数为j 
void init(){
	for(int i=1;i<=40;i++){
		dp[i-1][0]=1;
		for(int j=1;j<=i;j++){
			dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
		}
	}
}
int ask(int u){
	int w=0,a[45]={0};
	while(u){
		a[++w]=u%2;
		u=u/2;
	}
	int ans=0;
	for(int i=1;i<w-1;i++){
		for(int j=(i+2)/2;j<=i;j++){
			ans+=dp[i][j];
		}
	}
	int sum=0;
	for(int i=w-1;i>=1;i--){
		if(a[i]==1){
			for(int j=(w+1)/2;j<=i;j++){
				if(j-sum-1<0)continue;
				ans+=dp[i-1][j-sum-1];
			}
		}
		sum=sum+1-a[i];
	}
	return ans;
}
int main(){
	init();
	cin>>l>>r;
	cout<<ask(r)-ask(l-1)-1;
	return 0;
}
2023/9/6 21:27
加载中...