ABC128-F:Frog Jump

コンテスト中に解き切りたかったけど、細かいところも少し要求されるので厳しかったかな...。

問題

F - Frog Jump

解法

蓮以外の点に行かないようにしないといけないので、まず0 \lt B \lt A\leq N-1という条件が得られる。この下で、A,Bを決めたときの動きを観察すると、以下のように書ける。
0,A,A-B,2A-B,2A-2B,\cdots, (k+1)A-kB=N-1
ここで、C=A-Bとおけば、
0,A,C,A+C,2C \cdots A+kC = N-1
と書ける。つまり、k,Cさえ決めれば動きが定まり、kC\lt N-1より、あり得る(k,C)の組を全部試しても、各組をO(1)で調べることができれば全体でO(N\log{N})で間に合う(計算量が調和級数になるやつ)。実際、Cを固定してkを1増やすと、新たにs_{N-1-kC},s_{kC}に訪れることができるようになるから、各Cに対してkの小さい順に探索を進めればよい。
問題は、一度訪れた蓮の上には再度訪れることができないという条件だ。再度訪れることがあり得る(k,C)については探索してはいけない。このようなことが起こる(k,C)の条件を考えよう。動き方から、このようなことがあるとしたら、非負整数の組(k_1,k_2)が存在して、k_1C = A+Ck_2という等式が成り立つはずである。これはk_1=k_2+\frac{A}{C}と変形できるので、まずACで割り切れると危険だということがわかる。さらに、この等式を満たし、かつk_1が最小になるような(k_1,k_2)の組は当然(\frac{A}{C},0)である。このことより、\frac{A}{C} \gt kであれば、ACで割り切れても、蓮を再度訪れるということが起こる前にN-1の蓮にたどりついてゲームが終了する。したがって、条件を満たす(k,C)の組の条件は以下の12が同時に成り立つことである。

  1. A(=N-1-kC)Cで割り切れない。または、ACで割り切れるが、\frac{A}{C} \gt k
  2. 0 \lt B \lt A\leq N-1

実装

Submission #5662288 - AtCoder Beginner Contest 128

実装的には「条件が満たされないときに答えを更新しない」という書き方をした方が楽。

実装はたったこれだけ....。考察力が試される良問。