社区讨论
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 条回复,欢迎继续交流。
正在加载回复...