题解: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;
}
posted @ 2025-04-18 14:31  _Charllote  阅读(30)  评论(0)    收藏  举报