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\) の場合に注意してください。
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")
投稿日時:
最終更新: