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

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

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

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

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

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

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

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

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

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

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

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