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

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

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

=(02A1)(02B)= (0 \veebar 2 \veebar \cdots \veebar A-1) \veebar (0 \veebar 2 \veebar \cdots \veebar B)

=f(1,A1)f(1,B)= f(1,A-1) \veebar f(1,B)

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

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

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

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

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

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

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