这个题都说是水题,楞是没做出来,看了好多题解,感觉这个规律没看懂,后来在讨论区看到了一个题解,感觉有点懂了,写一下自己的理解
首先要明白异或的意思,简单一句话: 同0异1,既然这样,让求区间a,b 中异或最大的一个,那么最大的一组是多少呢,多谢几组数据,先求出来 a ^ b的值,因为这是求最大的基础,令x=a^b,那么x二进制第一个1应该出现在b为1,并且a为0, 因为b > a, 这个可以动手实验一下,那么由于任意取的两个数是位于a和b之间的,所以,这任意两个数的二进制位数一定是小于等于x二进制位数的,因为他是个区间,所以一定可以找到使得x的二进制的第一个1之后的各位全为1,那么这个最大值,这时候也就变成了x的二进制位数全为1的值,令n = x的二进制位数,结果就是2^n-1,举个例子,5 和 7, 那么5的二进制为101, 7的二进制为111,5^7=010,第一个1出现在第二位,那么1右边的那个0一定可以变化着两个数的值得到,即最大值去5,6,所以异或之后为3,二进制即为11,所以也就是2^2-1 = 3;
代码如下:
1 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 9 long long a, b; 10 while (~scanf("%lld %lld", &a, &b)) 11 { 12 13 long long x = a ^ b; 14 int c = 0; 15 while (x) 16 { 17 c++; 18 x >>= 1; 19 } 20 long long res = 1; 21 for (int i = 0; i < c; i++) 22 { 23 res *= 2; 24 } 25 printf("%lld\n", res - 1); 26 } 27 return 0; 28 }
时间: 2024-10-28 21:47:32