题目内容
Vjudge链接
给出一个闭区间,找该区间内两个数,使这两个数的按位或最大。
输入格式
包含至多(10001)组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数(l,r)。
保证$ 0le lle rle 10^{18}$。
输出格式
对于每组数据输出一行,表示最大的位或。
样例输入
5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000
样例输出
15
1
2047
511
1000000000000000000
思路
使位或最大,就在范围内,使二进制数的1尽可能多就好了。最后求出1最多的数和右端点位或一下。
注意用位运算的时候要强制转long long。
代码
#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
int T;
scanf("%d",&T);
while(T--){
ll a,b;
scanf("%lld%lld",&a,&b);
int pos=0;
while((a|((ll)1<<pos))<=b){
a|=((ll)1<<pos);
pos++;
}
printf("%lld
",a|b);
}
return 0;
}