题目:http://acm.hdu.edu.cn/showproblem.php?pid=5969
题意:给定自然数l和r ,选取2个整数x,y,满足l <= x <= y <= r,使得x|y最大。
分析:先把l和r转换成二进制位,举个栗子:
(假设LR最高位不是同一位):
x、y可以取二进制的11111(一定在L和R范围内的一个数)和100101(R),所以结果是11111或上100101即111111(63)
(如果LR最高位相同):
那就L和R都减去8,转换成L=01,R=001来看,此时x可以取11,y可以取001,所以x|y=111,再加上之前的8,答案是1111(15)
两种并在一起考虑:找出L、R找前面最大的相同位数,不同的地方开始,全部补1。
#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); while(T--) { long long a,b,res=0; scanf("%lld%lld",&a,&b); for(int i=63;i>=0;i--) { if(((1LL<<i)&a)==((1LL<<i)&b))continue; else { for(int j=i;j>=0;j--) { res|=(1LL<<j); } res|=a; break; } } res|=a; printf("%lld ",res); } return 0; }