解题思路
要求 p⊕(p+1)⊕⋯⊕q=w 且 q 最小、q≥p。直接从 p 往后扫最多约 106 步也能过,但用前缀异或可以 O(1) 判定。
- 记 xor_pref(n)=0⊕1⊕⋯⊕n,空前缀 xor_pref(−1)=0。则区间异或就是 xor_pref(q)⊕xor_pref(p−1)。
- 0 到 n 的连续异或每 4 个数一循环:若 nmod4=0 结果是 n;等于 1 结果是 1;等于 2 结果是 n+1;等于 3 结果是 0。
- 令 need=w⊕xor_pref(p−1),问题变成:最小的 q≥p 满足 xor_pref(q)=need。
- 前缀异或只能取到四类值:0、1、模 4 余 0 的数、模 4 余 3 的数。因此:
- need=0:取 q=0(仅当 p=0)或最小的 q≥p 且 qmod4=3;