该问题要求为所有整数对找到xor b的最大值 成对的整数a,b(l≤a≤b≤r)。如果l和R是8和16,则答案是31,实际上是15 x或16.我遇到了这段代码,它给出了正确的输出但是逻辑部分不清楚。
int main() {
cin >> A >> B;
ll num = 1;
while (A / num != B / num) {
num *= 2;
}
cout << num - 1 << "\n";
return 0;
}
答案 0 :(得分:1)
好吧,我可以轻松地破坏该代码。通过两次输入相同的数字。如果l = r则算法崩溃,但xor b的最大值显然是0,因为l = a = b = r。
假设l&lt; r,对于某些n,我们有(l /(2 ^ n))=(r /(2 ^ n))。有这样一个n因为我们可以选择n使2 ^ n&gt;河并且n> 0因为l&lt;河选择最小的这样的n。
在这种情况下,a /(2 ^ n)对于所有a具有相同的值,l≤a≤r。这意味着从位n开始的a ^ b中的所有位都为零。因此,xor b&lt; 2 ^ n,我们可以用l modulo(2 ^ n),r modulo(2 ^ n)替换l,r。
另一方面,选择n尽可能小。因此,在n中设置位n-1,而在l中清除位n-1。因此l < 2 ^(n-1),r≥2^(n-1)。我们可以选择a = 2 ^(n-1)-1,b = 2 ^(n-1)。然后l≤a≤b≤r,并且xor b = 2 ^ n - 1.由于我们证明xor b总是小于2 ^ n,但可以是2 ^ n - 1,因此它遵循2 ^ n - 1是最大值。
算法计算的正是什么,除了没有正确处理l = r。
答案 1 :(得分:0)
让我们以l = 8和r = 16或
为例l = 00010
r = 00001
代码的作用是将位移位直到数字相同:
num=2 num=4 num=8 num=16 num=32
00100 01000 10000 00000 00000
00010 00100 01000 10000 00000 -> done : max xor is 32-1
这是有效的,因为你可以获得的最大xor是尽可能多的位设置为1的数字,通常,如果你有
l = 0001010101010101011111111111110000001010101010...
r = 0010101010101010101101010101010100001010101010...
^...starting from here they are
the same (no matter what)
你可以从x和b得到的最大结果是l&lt; a&lt; b&lt; r是
111111111111111111111111111111110000000000000000000...