1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ARC 131 - C Zero XOR

Last updated at Posted at 2021-12-05

$ $
$A_1,A_2,\dots,A_N$の数列があり、2人のプレーヤーが一つずつ取っていく。
残った数のXORが0なら勝ち。先手必勝か先手必敗か。

エスパーかなと思いつつなんとかDPしたが当然TLE
典型90問の頃から忘却していなければ、ACできてたかも。

やったこと

XORが0になる数の組み合わせを色々つくった。以下2進数表記。
「011, 101, 110」… 3つのXORが0
「001, 010, 100, 111」… 4つのXORが0
「000011,000101,000110,011110,101110,110110」… 初めの3つのXORが0だが、後の4つでも0。7つ全部でも0。
あわせて0になる数の組み合わせが閉路になるようにグラフを作って、強連結成分分解?
奇数の成分となる閉路の数を数える?

$ $ということで、残りの数のXORを状態にして0になるループの組み合わせを数えてたら時間切れになった。アリバイに提出したコードはTLE。
$A_i$の上限は$2^{30}$程度なので、たとえば$A_i = 2^{i-1} (i=1,2,\dots,30)$ だと30要素しかないのにとりうる状態の数は$2^{30}$。間に合うわけがない理由はコンテスト後に明らかになった。

基本に帰る

XORに拘るのはほどほどにして、ゲーム問題として基本的な考察をすべきであった。

ゲーム問題の基本とは、

  • 先手が勝ちの状態に1手で遷移できるのであれば先手必勝
  • 先手から遷移できる状態が全て後手にとって必勝なら先手必敗(後手必勝)

そして、考察の基本

  • 極端な場合から考える

N=1

$ $極端な場合。カードが1枚しかないとき。
$A_1≠0$なので負けの状態ではない。
先手がその1枚を取って、残り0枚のXORは0なので先手必勝。

N=2

$A_1 ≠ A_2$なので$A_1;xor;A_2≠0$であり負けの状態ではない。
先手が2枚のうちどちらを取ってもN=1の場合に帰着する。
N=1が先手必勝なのでN=2は先手必敗。

N=3

$ $制約より$A_1;xor;A_2;xor;A_3≠0$であり負けの状態ではない。
先手が3枚のうちどれを取っても、残った数を$A_i,A_j;(i≠j)$とすると$A_i ≠ A_j$なので$A_i;xor;A_j≠0$。よってN=2の場合に帰着する。
N=2が先手必敗なのでN=3は先手必勝。

N=4

$ $制約より$ XOR_{i=1}^4 A_i≠0$であり負けの状態ではない。
先手が4枚のうちどれを取っても、残った数を$A_i,A_j,A_k$とすると$A_i;xor;A_j;xor;A_k≠0$。よってN=3の場合に帰着する。よって先手必敗
かというとそうではない。

先ほど挙げた「011, 101, 110」が残る場合など、XORが0になる場合が存在する。

1枚とった後のxorを0にすることができれば先手必勝。
できなければN=3の場合に帰着し先手必敗。

N=5

1枚とった後のxorを0にすることができれば先手必勝。
できなければN=4の場合に帰着する。つまり、「先手が1枚取って後手が1枚取った後に0にできれば先手必敗、できなければ先手必勝」。
少し言い換えると「先手がどの1枚を取っても後手が1枚取って0にできれば先手必敗、できなければ先手必勝」

N=N

1枚とった後のxorを0にすることができれば先手必勝。
そうでない場合、先手がどの1枚を取っても後手が1枚取って0にできれば先手必敗、できなければ$N-1$の場合に帰着。

$ $ここで考察が必要。添字のつけ方は任意であるから分かりやすいようにする。
先手が$A_1$をとったら後手が$A_2$をとって残りのxorを0にできるとする。
$XOR_{i=1}^N,A_i=x,(≠0)$とすると、$A_2 = x;xor;A_1,(≠A_1)$で一意に定まる。
先手が$A_2$をとったら後手は$A_1$をとればよい。
同様に、先手が$A_{2k-1}$をとったら後手が$A_{2k}$をとれば勝てることにする。
$N$が偶数の場合、これを繰り返して$A_{N-1},xor,A_N$までペアリングできるかもしれない。
しかし、奇数の場合は$A_N$が余り、先手が$A_N$を取ったときに後手が勝てる数が割り当てられない。よって、$N$が奇数の場合は「先手がどの1枚を取っても後手が1枚取って0にできる」状態は存在しない。なので、

1枚とった後のxorを0にすることができれば先手必勝。
そうでない場合、先手がどの1枚を取っても後手が1枚取って0にできれば先手必敗、できなければ$N-1$の場合に帰着。

再構成

N=1

先手必勝

N=2

先手必敗

N=3

先手必勝

N=4

1枚とった後のxorを0にすることができれば先手必勝。
できなければN=3の場合に帰着し先手必敗。

N=5

1枚とった後のxorを0にすることができれば先手必勝。
できなければ先手がどの1枚を取っても後手が1枚取って0にできれば先手必敗、できなければ
先手必勝

N=6

1枚とった後のxorを0にすることができれば先手必勝。
できなければN=5の場合に帰着し先手必敗。

まとめ

Nが奇数

先手必勝

Nが偶数

1枚とった後のxorを0にすることができれば先手必勝。
そうでない場合、先手必敗。

Take Home Message

エスパーはしようと思ってできるものではないので、一番基本から順番に考えましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?