Please help me I am too stupid
  • 板块题目总版
  • 楼主北射天狼
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/7/13 21:32
  • 上次更新2023/10/27 20:31:38
查看原帖
Please help me I am too stupid
289056
北射天狼楼主2022/7/13 21:32

question

#include <bits/stdc++.h>
using namespace std;
int l,r;
int dp[35][35][2];//dp[第几位][0的个数][最高位] = 有多少个圆数 
void Init(){
	dp[1][1][0]=1;
	for (int i=2;i<=32;i++){			
	    for (int k=i;k>=0;k--){
			dp[i][k][0]+=dp[i-1][k-1][0]+dp[i-1][k-1][1];
			dp[i][k][1]+=dp[i-1][k][0]+dp[i-1][k][1];
		}
	}
}
int Num(int x){
	int digit=0,a[40],ans=0;
	memset(a,0,sizeof(a));
	while (x){
		a[++digit]=x%2;
		x/=2;
	}
	for (int i=1;i<digit;i++){
		for (int j=1;j<=i;j++){
			if (j>=(i-1)/2+1){
				ans+=dp[i][j][1];
			}
		}
	}
	for (int i=digit-1;i>=1;i--){
		for (int j=0;j<a[i];j++){
			for (int k=i;k>=0;k--){
				if (k>=(i-1)/2+1){
					ans+=dp[i][k][j];
			    } 
			}
		} 
	}
	return ans;
} 
int main()
{
	Init();
	cin>>l>>r;
	//cout<<Num(l+1)<<endl;
	//cout<<Num(r+1)<<endl;
	cout<<Num(r+1)-Num(l)<<endl;
	return 0;
}
2022/7/13 21:32
加载中...