https://atcoder.jp/contests/abc121/tasks/abc121_d

ビットごとの排他的論理和は二回繰り返すと元に戻り、可換で結合法則を満たすことから、

f(A,B)=A⊻A+1⊻⋯⊻Bf(A,B)=A \veebar A+1 \veebar \cdots \veebar B

=(0⊻2⊻⋯⊻A−1)⊻(0⊻2⊻⋯⊻B)= (0 \veebar 2 \veebar \cdots \veebar A-1) \veebar (0 \veebar 2 \veebar \cdots \veebar B)

=f(1,A−1)⊻f(1,B)= f(1,A-1) \veebar f(1,B)

だから、A=0A=0 の場合に帰着される。

それぞれの桁毎に、0∼B0 \sim B に出てくる 11 の数が偶数個か奇数個か数えれば、f(1,B)f(1,B) の各ビットがわかる。 A=0A=0 の 1,2,3,...1,2,3,... のビット表示を確認すると、

10進数 2進数
0 00000000
1 00000001
2 00000010
3 00000011
4 00000100

11 の位は 0→1→0→1→⋯0 \rightarrow 1 \rightarrow 0 \rightarrow 1 \rightarrow \cdots と1つごとに切り替わり、 22 の位は 0→0→1→1→⋯0 \rightarrow 0 \rightarrow 1 \rightarrow 1 \rightarrow \cdots と2つ毎に切り替わり、と規則的になっている。

2i2^i 桁目のビットを考えよう。i=0i=0 の時は B≡1mod  4B \equiv 1 \mod 4 なら 11, それ以外なら 00 が立っている。

i≥1i \ge 1 であれば、2i+12^{i+1} 毎に 11 が 2i2^i 個(偶数個)出てくるから、11 の出現数の偶奇は (B+1)mod  2i+1(B+1) \mod 2^{i+1} で考えれば良い。 2i+12^{i+1} 個ごとの 0/10/1 の出現順は、最初に 00 が 2i2^i 個続き、そのあと 11 が 2i2^i 個続くから、 11 の数は、max⁡(0,((B+1)mod  2i+1)−2i)\max(0, ((B+1) \mod 2^{i+1}) - 2^i)。 この数が偶数なら 00, 奇数なら 11 のビットが立っている。

(実装は結構手間取りました) https://atcoder.jp/contests/abc121/submissions/32474342