NYOJ-744蚂蚁的难题(一)

这个题都说是水题,楞是没做出来,看了好多题解,感觉这个规律没看懂,后来在讨论区看到了一个题解,感觉有点懂了,写一下自己的理解

首先要明白异或的意思,简单一句话: 同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
", res - 1);
26     }
27     return 0;
28 }        
原文地址:https://www.cnblogs.com/Howe-Young/p/4175805.html