ABC128-F:Frog Jump
コンテスト中に解き切りたかったけど、細かいところも少し要求されるので厳しかったかな...。
解法
蓮以外の点に行かないようにしないといけないので、まずという条件が得られる。この下で、を決めたときの動きを観察すると、以下のように書ける。
ここで、とおけば、
と書ける。つまり、さえ決めれば動きが定まり、より、あり得るの組を全部試しても、各組をで調べることができれば全体でで間に合う(計算量が調和級数になるやつ)。実際、を固定してを1増やすと、新たにに訪れることができるようになるから、各に対しての小さい順に探索を進めればよい。
問題は、一度訪れた蓮の上には再度訪れることができないという条件だ。再度訪れることがあり得るについては探索してはいけない。このようなことが起こるの条件を考えよう。動き方から、このようなことがあるとしたら、非負整数の組が存在して、という等式が成り立つはずである。これはと変形できるので、まずがで割り切れると危険だということがわかる。さらに、この等式を満たし、かつが最小になるようなの組は当然である。このことより、であれば、がで割り切れても、蓮を再度訪れるということが起こる前にの蓮にたどりついてゲームが終了する。したがって、条件を満たすの組の条件は以下のとが同時に成り立つことである。
- がで割り切れない。または、がで割り切れるが、
実装
Submission #5662288 - AtCoder Beginner Contest 128
実装的には「条件が満たされないときに答えを更新しない」という書き方をした方が楽。
実装はたったこれだけ....。考察力が試される良問。