求调
查看原帖
求调
1087173
guer_loser_lcz楼主2025/1/14 20:35
#include<bits/stdc++.h>
using namespace std;
int a,b,dp[40][110],two[40],to,pow2[40];
int dfs(int len,int mx,int cha){
	if(len==0&&cha>=30)return 1;//符合条件
	else return 0;//不成立
	if(dp[len][cha]!=-1)return dp[len][cha];//记忆化
	int res=0;
	if(pow2[len]<=mx)res+=dfs(len-1,mx-pow2[len],cha-1);//能填一,不超限
	res+=dfs(len-1,mx,cha+1);//填零
	dp[len][cha]=res;//记忆化
	return res;
}
int s(int x){
	int y=x;
	to=0;
	memset(two,0,sizeof(two));
	while(y){
		two[++to]=y%2;
		y/=2;
	}//二进制
	memset(dp,-1,sizeof(dp));
	return dfs(to,x,30);
}
int main(){
	cin>>a>>b;
	for(int i=1,x=1;i<=35;i++){
		pow2[i]=x;
		x<<=1;//第i为二进制对应的十进制
	}
	cout<<s(b)-s(a);
	return 0;
} 
2025/1/14 20:35
加载中...