公式

B - Fennec VS. Snuke 2 解説 by hirayuu_At


ヒント → https://atcoder.jp/contests/arc192/editorial/12151


添字が \(S\) に含まれる項を区別する必要はないため、以下の問題を解けばよいです。

正整数 \(N\) と、長さ \(N\) の正整数列 \(A=(A_1,A_2,\dots,A_N)\) が与えられる。また、\(0\) で初期化された変数 \(X\) がある。 フェネックとすぬけくんは、フェネックから順に次の一連の操作を交互に行う。

  • 次のうちどちらかを選び、実行する。
    • \(1\leq A_i\) なる \(i\) を選ぶ。\(X\)\(A_i-1\) を加算し、\(A_i\)\(0\) にする。
    • \(X\) から \(1\) を引く。これは \(1\leq X\) のときに選ぶことができる。
  • \(A\) のすべての要素が \(0\) になっていたら、最後に操作したプレイヤーを勝者としてゲームを終了する。

フェネックとすぬけくんは、どちらも自身が勝者になることを目指して最適な行動を行う。どちらが勝者になるか?

ある \(X\) に対して必勝法がある人は、以下のようにすることで \(X\)\(2\) 大きい場合でも必勝法があることがわかります。

  • \(X\)\(2\) 小さいときの必勝法に従って \(X=2\) になったときに、相手が \(X\) に操作したなら自分も \(X\) に操作する。

よって、\(X\) の偶奇を保ったまま \(X\leq 1\) としてよく、さらに以下の問題に帰着することができます。ここで、\(C_o\)\(A\) の項のうち奇数であるものの個数、\(C_e\)\(A\) の項のうち偶数であるものの個数とします。

非負整数 \(C_o,C_e\) が与えられる。ここで、\(1\leq C_o+C_e\) であることが保証される。また、\(0\) で初期化された変数 \(X\) がある。 フェネックとすぬけくんは、フェネックから順に次の一連の操作を交互に行う。

  • 次のうちどれかを選び、実行する。
    • \(C_o\) から \(1\) を引く。これは \(1\leq C_o\) のときに選ぶことができる。
    • \(C_e\) から \(1\) を引き、\(X\)\(1-X\) で置き換える。これは \(1\leq C_e\) のときに選ぶことができる。
    • \(X\)\(0\) にする。これは \(X=1\) のときに選ぶことができる。
  • \(C_o=C_e=0\) になっていたら、手番のプレイヤーを勝者としてゲームを終了する。

フェネックとすぬけくんは、どちらも自身が勝者になることを目指して最適な行動を行う。どちらが勝者になるか?

さらに場合分けをします。


タイプ1: \(C_o\)\(C_e\) がともに偶数のとき

すぬけくんの必勝です。フェネックが選んだ操作と全く同じものを選び続ければよいです。

タイプ2: \(C_o\) が奇数で \(C_e\) が偶数のとき

フェネックの必勝です。はじめ \(C_o\) に操作をすると、タイプ1に帰着できます。

タイプ3: \(C_o=C_e=1\) のとき

すぬけくんの必勝です。フェネックが操作したら、次の手番でただちにゲームを終了させることができます。

タイプ4: \(C_o\)\(C_e\) がともに奇数で、\(3\leq C_e\) のとき

フェネックの必勝です。はじめ \(C_o\) に対して操作をします。その後、以下のように操作します。

  • すぬけくんが \(C_o\) に対して操作したならフェネックもそうする。
  • すぬけくんが \(C_e\) に対して操作したならフェネックは \(X\) に対して操作する。このあと、タイプ1に帰着できる。

タイプ5: \(C_o\)\(C_e\) がともに奇数で、\(3\leq C_o\) のとき

フェネックの必勝です。はじめ \(C_e\) に対して操作をします。その後、以下のように操作します。

  • すぬけくんが \(C_e\) に対して操作したならフェネックもそうする。
  • すぬけくんが \(C_o\) に対して操作したならフェネックは \(X\) に対して操作する。このあと、タイプ1に帰着できる。
  • すぬけくんが \(X\) に対して操作したならフェネックは \(C_o\) に対して操作する。このあと、タイプ1に帰着できる。

タイプ6: \(C_o=0,C_e=1\) のとき

自明にフェネックの必勝です。

タイプ7: \(C_o=2,C_e=1\) のとき

フェネックの必勝です。はじめ \(C_o\) に操作すると、タイプ3に帰着できます。

タイプ8: \(C_o\) が偶数、\(C_e\) が奇数で \(3\leq C_e\) のとき

すぬけくんの必勝です。以下のように操作します。

  • フェネックが \(C_o\) に対して操作したならすぬけくんもそうする。
  • フェネックが \(C_e\) に対して操作したならすぬけくんは \(X\) に操作する。このあと、タイプ1に帰着できる。

タイプ9: \(C_o\) が偶数、\(C_e\) が奇数で \(4\leq C_o\) のとき

すぬけくんの必勝です。フェネックが \(C_o\) に操作したならタイプ5に帰着できます。フェネックが \(C_e\) に操作したなら、その後すぬけくんが \(X\) に操作することでタイプ1に帰着できます。


以上ですべての場合が尽くされました。さらに整理すると、\(4\leq N\) のとき、\(C_o\) の偶奇が勝敗を分けることがわかります。\(N\leq 3\) の場合に注意してください。

実装例 (PyPy3)

N = int(input())
A = list(map(int, input().split()))

odd = 0
for a in A:
    if a % 2 == 1:
        odd += 1

if N == 1:
    print("Fennec")
elif N == 2:
    print("Snuke")
elif N == 3 and odd == 2:
    print("Fennec")
elif odd % 2 == 1:
    print("Fennec")
else:
    print("Snuke")

投稿日時:
最終更新: