きろく

特筆すべき記録のまとめ

エクサウィザーズ 2019:D - Modulo Operations

問題

atcoder.jp

解法

dp(i, j) := 今黒板に書かれている数が i で,j 個 S から取り出したとき,これからの操作で考えうる最後に書かれる数の和

と DP をたてる.また,ある数字 x よりも大きい数字 y で mod をとっても x は変わらないので,y は x に対して行われる操作のどこに入れても答えは変わらない.これを踏まえると,

dp(i, j) = dp(i % S[j], j + 1) + (dp(i, j + 1) * (N - j - 1))

と遷移が出来る.これは,S[j] で mod を取るかどうかで場合分けしていて,前者は取る場合で後者は取らない場合になる.後者で * (N - j - 1) しているのは,mod を取る操作をパスした S[j] という数字をどのタイミングで操作に入れるのかは,前述の通り j + 1 回目以降の操作で最初でなければどこでもよいので(最初だと前者と重複してしまう),(N - j - 1) 通りのタイミングが考えられるため.O(NX).

解答

atcoder.jp

コンテスト中は無駄に DP の漸化式を複雑化してしまった(mod をとっても意味のないところは二分探索をしてパスさせて,パスした要素は順列になるからどう組み合わせるかなど)ので解けなかった.

f:id:babcs2035:20190331142659p:plain