题意:给你D(D<=2^31),s1和s2,求比D大的第一个数并且这个数二进制1的数目在[s1,s2]范围里,输出这个数
思路:直接从D+1算起,如果1的数目>s2那就跳过,如果s1>sum1,那么就将这个数的低位s1-sum1个0补成1,那么就是最优的了
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int a[40];
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
printf("Case #%d: ",cas++);
LL d,s1,s2,cnt=0;
LL sum = 0;
int pos = 0;
int flag = 0;
scanf("%lld%lld%lld",&d,&s1,&s2);
while(1)
{
memset(a,0,sizeof(a));
pos = 0;
sum = 0;
cnt++;
LL ans = d+cnt;
while(ans)
{
if(ans&1)a[pos]=1,sum++;
else a[pos]=0;
pos++;
ans>>=1;
}
if(sum>s2)continue;
if(sum>=s1&&sum<=s2)
{
printf("%lld\n",cnt+d);
flag = 1;
break;
}
int b = s1-sum;
int j = 0;
while(b)
{
if(a[j]==0)
{
a[j]=1;
b--;
}
j++;
}
break;
}
LL ans = 0;
LL temp = 1;
if(!flag)
{
for(int i = 0;i<40;i++)
{
if(a[i])
ans+=temp;
temp<<=1;
}
}
if(!flag)
printf("%lld\n",ans);
}
}