题目内容

Vjudge链接

给出一个闭区间,找该区间内两个数,使这两个数的按位或最大。

输入格式

包含至多\(10001\)组测试数据。

第一行有一个正整数,表示数据的组数。

接下来每一行表示一组数据,包含两个整数\(l,r\)。

保证$ 0\le l\le r\le 10^{18}$。

输出格式

对于每组数据输出一行,表示最大的位或。

样例输入

样例输出

思路

使位或最大,就在范围内,使二进制数的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\n",a|b);
}
return 0;
}
05-11 22:13