首页 > 代码库 > NYOJ-744蚂蚁的难题(一)

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\n", res - 1);26     }27     return 0;28 }        

 

NYOJ-744蚂蚁的难题(一)