バイトの競プロメモ

主に競技プログラミング

D - Range XOR - AtCoder Regular Contest 133

 

解説を理解するのに時間かかった...

D - Range XOR

以下はkmjpさんのブログ記事

AtCoder ARC #133 : D - Range XOR - kmjp's blog

を読んで理解したものなのですが、備忘録として残します。

問題


整数L, R, Vが与えられる。

L<=l<=r<=Rで、lからrまでのxorがVになるようなl, rの組は何通りあるか。

 

解法


f(x) := 0~x-1までのxorを取ったものとすると、mod4で周期があり

 

f(4n+0) = 0

f(4n+1) = 4n

f(4n+2) = 1

f(4n+3) = 4n+3

のようになります。

 

以後桁dpで解く

l, rを4で割った余りについて条件を満たすものを数え上げると

 

X(l, r) := [l, r)のxorとすると

X(l, r) = f(l) ^ f(r)ですが

l, rの値からX(l, r)を4で割った余りはO(1)で分かります。

 

少なくとも4で割った余りが正しいかについてはそれで判定が出来て

bitで2桁よる上の物について、L < Rになるようにbit毎に値を決めていく

この際、4nが付いている者はここで選んだbitが値に反映され

4nが付いていない物はここで選んだbitが値に反映されない。

この上でxorがVになるように決めてやればいい。

最終的にL, Rの大小関係は4で割った余りを反映して考える事に注意