Description:
给定整数 A , B A,B A,B,求该范围内连续数字的异或,即 A ⊕ ( A + 1 ) ⊕ ( A + 2 ) ⊕ ⋅ ⋅ ⋅ ⊕ ( B − 1 ) ⊕ B A \oplus (A+1) \oplus (A+2) \oplus ··· \oplus (B-1) \oplus B A⊕(A+1)⊕(A+2)⊕⋅⋅⋅⊕(B−1)⊕B。
Constrains:
- 0 ≤ A ≤ B ≤ 1 0 12 0 \leq A \leq B \leq10^{12} 0≤A≤B≤1012
Analysis:
- 数据范围如此之大,显然不能暴力遍历,自然要从异或运算的性质入手:
交换律: A ⊕ B = B ⊕ A A \oplus B =B \oplus A A⊕B=B⊕A;进而可以扩展为无序性的感觉,即一串数字的连续异或可以按照任意顺序进行。
结合律: ( A ⊕ B ) ⊕ C = A ⊕ ( B ⊕ C ) (A\oplus B)\oplus C = A \oplus (B \oplus C) (A⊕B)⊕C=A⊕(B⊕C),同样可以按照上述无序性来理解。
常见的运算性质:对于任意数 X X X,都有 X ⊕ X = 0 X\oplus X = 0 X⊕X=0, X ⊕ 0 = X X \oplus 0 = X X⊕0=X
自反性: A ⊕ B ⊕ B = A ⊕ 0 = A A \oplus B \oplus B = A\oplus 0 = A A⊕B⊕B=A⊕0=A
- 对于本题,需要特别强调的性质如下:
对于一个偶数 X X X,有: X ⊕ ( X + 1 ) = 1 X \oplus (X+1) = 1 X⊕(X+1)=1,显然相邻偶与奇只相差二进制的最后一位,故异或结果为1;(本题的关键!!)
对于一个奇数 X X X,有: 1 ⊕ X = X − 1 1 \oplus X = X-1 1⊕X=X−1(本题貌似没有用上,当时比赛的时候
顺便推出来的)
对于一个偶数 X X X,有: 1 ⊕ X = X + 1 1 \oplus X = X+1 1⊕X=X+1(要用!)
- 设题目求解为 F ( A , B ) F(A,B) F(A,B),则该问题可拆解为 F ( 0 , A − 1 ) ⊕ F ( 0 , B ) F(0,A-1) \oplus F(0,B) F(0,A−1)⊕F(0,B),下对此问题转化进行说明:区间 [ 0 , B ] [0,B] [0,B] 显然由 [ 0 , A − 1 ] [0,A-1] [0,A−1] 和 [ A , B ] [A,B] [A,B] 构成,根据自反性和无序性, F ( 0 , A − 1 ) ⊕ F ( 0 , B ) = F ( 0 , A − 1 ) ⊕ F ( 0 , A − 1 ) ⊕ F ( A , B ) = 0 ⊕ F ( A , B ) = F ( A , B ) F(0,A-1) \oplus F(0,B) = F(0,A-1) \oplus F(0,A-1) \oplus F(A,B) = 0 \oplus F(A,B) = F(A,B) F(0,A−1)⊕F(0,B)=F(0,A−1)⊕F(0,A−1)⊕F(A,B)=0⊕F(A,B)=F(A,B)
- 为什么要从 0 开始呢?其实从1开始也不是不行,只是从 0 开始,可以直接从0(偶数)开始运用 偶数 ⊕ \oplus ⊕(偶数+1)的运算性质,其次数据范围从 0 开始,故便于处理。
- 下面开始考虑区间 [ 0 , r ] [0,r] [0,r] 中连续数字异或的规律:
如 0 ⊕ 1 ⊕ 2 ⊕ 3 ⊕ 4 ⊕ 5 ⊕ 6 0 \oplus 1 \oplus 2 \oplus 3 \oplus 4 \oplus 5 \oplus 6 0⊕1⊕2⊕3⊕4⊕5⊕6,如若两两配对,运用上述性质,原式等于 ( 0 ⊕ 1 ) ⊕ ( 2 ⊕ 3 ) ⊕ ( 4 ⊕ 5 ) ⊕ 6 = 1 ⊕ 1 ⊕ 1 ⊕ 6 = 1 ⊕ 6 = 7 (0 \oplus 1) \oplus (2 \oplus 3) \oplus (4 \oplus 5) \oplus 6 = 1 \oplus 1 \oplus 1 \oplus 6 = 1\oplus 6 = 7 (0⊕1)⊕(2⊕3)⊕(4⊕5)⊕6=1⊕1⊕1⊕6=1⊕6=7
如 0 ⊕ 1 ⊕ 2 ⊕ 3 ⊕ 4 0 \oplus 1 \oplus 2 \oplus 3 \oplus 4 0⊕1⊕2⊕3⊕4,如若两两配对,运用上述性质,原式等于 ( 0 ⊕ 1 ) ⊕ ( 2 ⊕ 3 ) ⊕ 4 = 1 ⊕ 1 ⊕ 4 = 0 ⊕ 4 = 4 (0 \oplus 1) \oplus (2 \oplus 3) \oplus 4 = 1 \oplus 1 \oplus 4 = 0\oplus 4 = 4 (0⊕1)⊕(2⊕3)⊕4=1⊕1⊕4=0⊕4=4
- 由自反性,奇数个 1 1 1 连续异或的结果为 1 1 1,偶数个 1 1 1 连续异或的结果为 0 0 0。故只需判断右界 r r r 和配对数 p a i r s pairs pairs 的奇偶性,分情况计算即可。
Solution:
ll F(ll r) { // 只考虑右界即可,左界默认为 0
ll pairs = (r + 1) >> 1;
if(r & 1) { // r+1为偶数,恰好两两配对,pairs个1异或
if(pairs & 1) return 1; // 奇数个1
else return 0; // 偶数个1
}
else { // 配对后还剩下 r
if(pairs & 1) return r + 1; // 1 xor r
else return r; // 0 xor r
}
}
void solve() {
ll a,b; cin >> a >> b;
if(a == 0) cout << F(b) << endl; //防止左界为-1
else cout << (F(a-1)^F(b)) << endl;
}