Xmas Contest 2020 C: Candies Candidates 解説
https://atcoder.jp/contests/xmascon20/tasks/xmascon20_c
問題概要
数列中の正の整数 を または に変えられるゲームがある.与えられた数列が先手必勝か後手必勝か判定せよ.
とりあえず
値が減っていく不偏ゲームなので (short impartial game なので),各皿の Grundy 数を考えて XOR をとればよいです.
行動が 通りしかないので Grundy 数も高々 までしか登場しません.が,これ以上は見て直ちにわかることはないので,実験しましょう.
解法 1 (観察)
実験して出てきた の列をぐっとにらむと,再帰的構造が見えてくるかもしれません.
解法 2 (OEIS)
の列を OEIS に入れても出てこない (2020 年 12 月現在) のですが,Grundy 数がそれぞれ になる値の列はなんと出てきます:
これらのタイトル通りに実装すると (あるいは解法 1 でもそうかもしれませんが) 小数計算が必要になります.整数と整数の比は黄金比にかなり近くなりうるので (隣接する Fibonacci 数), などを求める時点でかなりの精度が要求されます.Java の BigDecimal や Python の Decimal などを用いて正解できます.
解法 3 (Zeckendorf representation)
よく見ると上の の OEIS にもちらっと書いてあるのですが,Zeckendorf representation,いわゆる Fibonacci 進法を考えるとうまくいきます.任意の非負整数は相異なる隣接しない Fibonacci 数の和の形に一意に表すことができ,その表示は大きいほうから貪欲にとっていくことで求められます.この表示と Grundy 数を並べて出力してみると,以下のことに気づくことができると思います.
- Grundy 数が : または,用いる最小の Fibonacci 数が (Fibonacci 進法で末尾の が奇数個)
- Grundy 数が :用いる最小の Fibonacci 数が (Fibonacci 進法で末尾が )
- Grundy 数が :用いる最小の Fibonacci 数が (Fibonacci 進法で末尾の が正の偶数個)
証明
Fibonacci 数を とします. とおいて, です.
の Zeckendorf representation の形で場合分けして と の表示を求めます.以下 の部分は番号が大きい部分の隣接しない Fibonacci 数の有限和とします (丁寧に書くと煩雑なので許してください).
- 偶数 に対し のとき,
- 奇数 に対し のとき,
- に対し のとき,
これらはすぐわかると思います ( に あるいは を順に足してみてください).
- 偶数 に対し のとき,
- 奇数 に対し のとき,
- に対し のとき,
これらはすぐわからないと思いますので示していきます. の部分も番号が ずつ小さくなります.
とおくと,
となります. なので,気持ちとしては, の累乗は符号を変えながら指数的に減っていくので,一番小さい番号の部分に支配されその偶奇で符号が決まります.
が偶数のとき,
より です.これより, および が従い, が得られました.
が奇数のとき,
より です.これより, が従い, が得られました.
以上で の表示は証明できました.これを用いると,元の問題の Grundy 数についての主張は帰納法で示されます.
統計情報
正解者:チーム korotkevin (0:19:32) はじめ 47 チーム
コメント
簡単な設定で黄金比が登場する Wythoff's game というゲームがよく知られています.ではゲームに黄金比を直接登場させてみるとどうなるか?という動機で問題を作ってみました.Fibonacci 進法で書いてみたらちょうどよい複雑さになっていてびっくりでした.Wythoff's game や OEIS 解に登場している Beatty sequence や Wythoff sequence といった,非負整数全体の分割が無理数や floor によって綺麗に表されるという構造が,組合せゲームとの相性がよいようですね.
おまけ
問題が の代わりに だったらどうなるでしょう?