【题解】ATCoder_abc121_D - XOR World 区间连续异或


Link: D - XOR World 连续异或

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)⋅⋅⋅(B1)B

Constrains:

  • 0 ≤ A ≤ B ≤ 1 0 12 0 \leq A \leq B \leq10^{12} 0AB1012

Analysis:

  • 数据范围如此之大,显然不能暴力遍历,自然要从异或运算的性质入手:

交换律 A ⊕ B = B ⊕ A A \oplus B =B \oplus A AB=BA;进而可以扩展为无序性的感觉,即一串数字的连续异或可以按照任意顺序进行。
结合律 ( A ⊕ B ) ⊕ C = A ⊕ ( B ⊕ C ) (A\oplus B)\oplus C = A \oplus (B \oplus C) (AB)C=A(BC),同样可以按照上述无序性来理解。
常见的运算性质:对于任意数 X X X,都有 X ⊕ X = 0 X\oplus X = 0 XX=0 X ⊕ 0 = X X \oplus 0 = X X0=X
自反性 A ⊕ B ⊕ B = A ⊕ 0 = A A \oplus B \oplus B = A\oplus 0 = A ABB=A0=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 1X=X1本题貌似没有用上,当时比赛的时候顺便 推出来的)

对于一个偶数 X X X,有: 1 ⊕ X = X + 1 1 \oplus X = X+1 1X=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,A1)F(0,B),下对此问题转化进行说明:区间 [ 0 , B ] [0,B] [0,B] 显然由 [ 0 , A − 1 ] [0,A-1] [0,A1] [ 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,A1)F(0,B)=F(0,A1)F(0,A1)F(A,B)=0F(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 0123456,如若两两配对,运用上述性质,原式等于 ( 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 (01)(23)(45)6=1116=16=7
0 ⊕ 1 ⊕ 2 ⊕ 3 ⊕ 4 0 \oplus 1 \oplus 2 \oplus 3 \oplus 4 01234,如若两两配对,运用上述性质,原式等于 ( 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 (01)(23)4=114=04=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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值