社区讨论

30 分求条

P6218[USACO06NOV] Round Numbers S参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mlh9kgng
此快照首次捕获于
2026/02/11 08:00
4 周前
此快照最后确认于
2026/02/12 14:40
4 周前
查看原帖
CPP

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define db double
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
int md;
ll dp[35][2][2][35][35];
ll a[35];
ll b[35];
int k;
ll dfs(int dep,bool lim,bool is,int sum0,int sum1)
{
	if(!dep) return sum0>=sum1;//剩下的 
	if(dp[dep][lim][is][sum0][sum1]!=-1)	return dp[dep][lim][is][sum0][sum1];
	
	int res=0;
	int up=lim?a[dep]:1;
	for(int i=0;i<=1;i++)
	{
		if(is && i==0) res+=dfs(dep-1,lim&&(i==a[dep]),is&&(i==0),0,0);
		else
		{
			res+=dfs(dep-1,lim&&(i==a[dep]),is&&(i==0),sum0+(i==0),sum1+(i==1));
		 } 
	} 
	
	dp[dep][lim][is][sum0][sum1]=res;
	return res;
}
ll f(int x)
{
	memset(dp,-1,sizeof dp);
	ll le=0;
	ll ans=0;
	while(x) a[++le]=x%2,x/=2;
//	for(int i=1;i<=le;i++)
//	{
//		a[i]=b[le-i+1];
//	}
////	cout<<endl;
	ans+=dfs(le,1,1,0,0);
		
	
	return ans;
}


signed main()
{
	int l,r;
	
	cin>>l>>r;
	cout<<f(r)-f(l-1)<<endl;
	

	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...