原题链接:
http://acm.ecnu.edu.cn/problem/3303/
分析:
数据量大考虑按位处理
每次把 L 中的二进制其中一个0变成1,直到比R大
有多个优先输出小的,也就是二进制中0在高位的,也就是优先将低位0变1 使用ans|=ans+1;将最低位0变1
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
ll l,r,ans;
int n;
void show(){
char s[66];
itoa(ans,s,2);//将ans转换成二进制保存在s中
printf("%s\n",s);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%llu%llu",&l,&r);
ans=l;
while((ans|(ans+1))<=r){
ans|=ans+1;
//show();
}
printf("Case %d: %llu\n",i,ans);
}
return 0;
}