这个题目比较简单,把所有数转换成二进制找找规律就行,比如说 1和110可以位或成111,
10和101也可以位或成111,我们把r这个数的所有的二进制0转化为1,产生出一个新数mr,
然后mid=mr/2,r必定大于mid,如果L<=mid的话,mr就是答案,否则的话,把最高二进制位
提取出出来,在进行一次上述操作,细节的问题看代码
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
long long GetResult(long long L,long long R)
{
long long r=R,mr=0,mid;
while(r>0)
{
mr<<=1;
mr|=1;
r>>=1;
}
mid=mr/2;
if(L<=mid&&R>mid)
return mr;
else
return (mid+1)+GetResult(L-(mid+1),R-(mid+1));
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
long long L,R;
scanf("%lld%lld",&L,&R);
if(L==R) printf("%lld\n",L);
else printf("%lld\n",GetResult(L,R));
}
}