B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
Input包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 10181018。Output对于每组数据输出一行,表示最大的位或。Sample Input
5 1 10 0 1 1023 1024 233 322 1000000000000000000 1000000000000000000
Sample Output
15 1 2047
1 #include <iostream> 2 using namespace std; 3 #include<string.h> 4 #include<set> 5 #include<stdio.h> 6 #include<math.h> 7 #include<queue> 8 #include<map> 9 #include<algorithm> 10 #include<cstdio> 11 #include<cmath> 12 #include<cstring> 13 #include <cstdio> 14 #include <cstdlib> 15 #include<cstring> 16 unsigned long long n,m; 17 int a[2000],b[2000]; 18 int achang,bchang; 19 int meishaomvbianshen1( unsigned long long q) 20 { 21 int i; 22 for(i=0;q!=0;i++) 23 { 24 a[i]=q%2; 25 q/=2; 26 } 27 return i; 28 } 29 int meishaomvbianshen2( unsigned long long q) 30 { 31 int i; 32 for(i=0;q!=0;i++) 33 { 34 b[i]=q%2; 35 q/=2; 36 } 37 return i; 38 } 39 int main() 40 { 41 int i; 42 int t; 43 cin>>t; 44 while(t--) 45 { 46 cin>>n>>m; 47 memset(a,0,sizeof(a)); 48 memset(b,0,sizeof(b)); 49 achang=meishaomvbianshen1(n); 50 bchang=meishaomvbianshen2(m); 51 if(achang<bchang) 52 { 53 unsigned long long sum=0; 54 unsigned long long add=1; 55 for(i=0;i<bchang;i++) 56 { 57 sum+=add; 58 add*=2; 59 } 60 cout<<sum<<endl; 61 continue; 62 } 63 else if(achang==bchang) 64 { 65 if(n==m) 66 { 67 cout<<n<<endl; 68 continue; 69 } 70 int flag=0; 71 for(i=achang-1;i>=0;i--) 72 { 73 if(flag) 74 a[i]=1; 75 else if(a[i]!=b[i]) 76 { 77 a[i]=1; 78 flag=1; 79 } 80 } 81 unsigned long long sum=0; 82 unsigned long long add=1; 83 for(i=0;i<achang;i++) 84 { 85 sum+=a[i]*add; 86 add*=2; 87 } 88 cout<<sum<<endl; 89 } 90 } 91 return 0; 92 }
511 1000000000000000000
不多BB 代码简单易懂 还略显风骚