首页 > 代码库 > 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蚂蚁的难题(一)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。