http://acm.hdu.edu.cn/showproblem.php?pid=5969
对于一个l和r
我们都看成2进制
最优情况一定是1000和0111来异或这样就能得到在位数不可能改变的情况下能够得到的最大值,
那么如果l到r能够存在这种情况就这么异或
但如果l和r的位数相同,那么就保留前面相同位数上的0和1,一旦遇到不同则按照以上方法对低位取xxxxx1000和xxxxx0111异或
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
unsigned long long er[77];
er[0]=1;
for(int i=1;i<=63;i++)
{
er[i]=er[i-1]*2;
}
cin>>t;
while(t--)
{
unsigned long long l,r;
cin>>l>>r;
int lz[77];
int lr[77];
int js=0;
while(l)
{
lz[js++]=l%2;
l/=2;
}
int js1=0;
while(r)
{
lr[js1++]=r%2;
r/=2;
}
if(js1!=js)
{
unsigned long long ans;
ans=er[js1]-1;
cout<<ans<<endl;
}
else
{
unsigned long long ans=0;
for(int i=js-1;i>=0;i--)
{
if(lz[i]==lr[i])
{
if(lz[i]==1)
ans=ans+er[i];
}
else{
unsigned long long tt=er[i+1]-1;
ans=ans+tt;
break;
}
}
cout<<ans<<endl;
}
}
return 0;
}