题解:SP25844 MAXXOR - Find the max XOR value
前言:什么是异或
异或,数学符号为 \(\oplus\),计算机符号为 \(\operatorname{xor}\)。其运算法则为:\(a \oplus b = (\neg\ a \land b) \lor (a \land \neg\ b)\)。
如果 \(a\)、\(b\) 两个值不相同,则异或结果为 \(1\)。如果 \(a\)、\(b\) 两个值相同,异或结果为 \(0\)。
异或具有归零律\(( a \oplus a = 0 )\)、恒等律\(( a \oplus 0 = a )\)、交换律\(( a \oplus b = b \oplus a )\)、结合律\(( a \oplus b \oplus c = a \oplus ( b \oplus c ) )\)。
解题思路
首先我们设 \(x = L \oplus R\)。我们可以得到一个结论:答案为 \((\underbrace{1111 \dots 111}_{\lceil \log^2 x \rceil-1})_2 = 2^{\lceil \log^2 x \rceil} - 1\)。
为什么呢?请看证明:
因为异或又称是不进位二进制加法,所以答案的最大值是 \(2^{\lceil \log^2 R \rceil} - 1\)。
\((x)_2\) 中有 \(k\) 个 \(1\),这说明 \((x)_2\)、\((y)_2\) 中有\(k\) 个位置不同(见前言中异或的含义)。显然,在区间 \([ l , r ]\) 中,一定有一个数它对应的 \(k\) 个位置为 \(1\)(因为区间内的数字是连续的)。用这个数与之异或答案为 \(2^{\lceil \log^2 x \rceil} - 1\)。
时间复杂度:\(\operatorname{\Theta(1)}\)
AC代码
#include<bits/stdc++.h>
using namespace std;
int l,r;
int main(){
scanf("%d%d",&l,&r);
printf("%d",(1<<(int)ceil(log(r^l)/log(2)))-1);
return 0;
}

浙公网安备 33010602011771号