バイトの競プロメモ

主に競技プログラミング

F - Unfair Nim AtCoder Beginner Contest 172

f:id:baitop:20220206141642p:plain

F - Unfair Nim

 

解答

(A[0]-x)^(A[1]+x) == A[2]^...^A[N-1]になるようなxがあるかという問題である

 

a2 =A[0]-x, b2 =A[1]+xとして、a2とb2を求める事にする

 

問題文より、a2は以下を満たす最大の値になる

0 <= a2 <= A[0]

a2 + b2 = A[0] + A[1]

a2 ^ b2 = A[2]^....A[N-1]

 

ここで足し算は繰り上がりが面倒なので

式変形してbit毎に独立した問題にすることを考える

a2 & b2  = (a2+b2 - (a2^b2)) / 2

より

 

S, Xが与えられるので

「以下を満たす最大のa2を求めよ」という問題が解ければこの問題が解ける

0 <= a2 <= A[0]

a2 & b2 = S

a2 ^ b2 = X

 

これは自然な桁dpで解ける

類題

D - AND and SUM

 

------------------------------------------------------------------------------------

式変形をせず、問題通りにA[0]からA[1]にbit毎に渡して行く解法もあるらしい

とても奇麗なので書いておこうと思う。

 

ビットごとに下から考えて、今見ている桁のビットをA[0]からA[1]に配る場合と配らない場合で遷移する

ビットを送るか否かで最下位ビットのxorは変わらないので、それを満たさない場合はINFを返していい

 

f:id:baitop:20220206144940p:plain