143今回の難易度調整はなかなか綺麗な傾斜でよかったのではないでしょうか。10^9$解法Editorialを踏襲。山を選んで石を取るゲームといえばGrundy数を使うNimが有名だが、これは2人の操作が同条件でないと使えない(はず)。今回は先手と後手で取れる石の数が異なる。みたいな法則がある場合が多い。変わらない」というのは比較的思いつきやすい。割ったあまりの数列を考える。先手が操作した山を、後手は必ず操作できる。後手が先手と同じ山の組を選び続けることで、後手必勝。先手を太郎、後手を次郎とする。以上の山を全て取るのがよい。未満の状況は先手である次郎から見ると1の状態となり、後手(=入れ替える前の先手)である太郎が必勝。場合、少し思考が深くなる。数列の値は3種類ある。いずれかの状態になる。太郎としては自分が必勝の1の状態に持ち込みたい。以上の山が1つもあってはいけない。以上の山を1つでも残して渡してしまったら、2aの状態になり太郎は負ける。未満なので、(1)と(3)しかなければ1になり太郎(先手)必勝。状態になるので、次郎(後手)必勝となる。葉の頂点は、隣接頂点が1つだけ。色によって一意に決まる。取り除いたグラフ上で同じ問題が解ければよくなる。ひっくり返した状態を、新しいグラフ上での初期状態とする。葉を取り除くことで新たに葉となる頂点が生まれたりして、これはグラフが1頂点になるまで繰り返せる。最終的に残った1頂点が黒となってしまったら不可能。白だったら可能となる。辞書順最小の操作順を考える。この条件を全て満たせば、必ず全ての石を取り除ける。トポロジカルソートを行えばよい。「自身より先に操作しなければならない頂点がない頂点」は、初手から自由に選べる。これを最初の候補として、この中から1個ずつ選び操作を確定させていき、順次「自身より先に操作しなければならない未操作の頂点がなくなった頂点」を候補に加えていけば、適切な操作順を構築できる。そのとき、候補が複数あったらheapqを使って小さい順に取り出すことで、辞書順最小を達成できる。葉から1個ずつ切り取っていくという解法はたまに見るが、これもそれで行けることになかなか気づけなかった。ikatakosメディアマネージャー文書の先頭へ。