2019年5月28日火曜日

ABC 128 F - Frog Jump

ABC 128 F - Frog Jump

A,B∈NA, B \in {\mathbb N}が与えられたときの経路は(N−1N-1にたどりつくなら)

0,A,A−B,2A−B,...,kA−(k−1)B (=N−1)0, A, A-B, 2A-B, ..., kA-(k-1)B \: (=N-1)

のようになっている。C:=A−BC:=A-BとするとB+kC=N−1B+kC=N-1が成り立つので、逆にk,Ck, Cが与えられるとB=N−1−kCB = N-1-kC, A=N−1−(k−1)CA= N-1-(k-1)Cとなって経路が決まることになる。f(k,C)f(k, C)をこの経路の最終得点とする。A,B>0⇔kC<N−1A, B > 0 \Leftrightarrow kC < N-1だから、kC<N−1kC < N-1を満たすようなO(Nlog⁡N){\mathcal O}(N\log N)通りのk,Ck, Cについてf(k,C)f(k, C)を求めればよい。

ffの漸化式について考える。k,Ck, Cが与えられたときの経路は

0,N−1−(k−1)C,C,N−1−(k−2)C,2C,...,N−1−C,(k−1)C,N−10, N-1-(k-1)C, C, N-1-(k-2)C, 2C, ..., N-1-C, (k-1)C, N-1

であり、kkを1増やすと

0,N−1−kC,C,N−1−(k−1)C,2C,...,N−1−C,kC,N−10, N-1-kC, C, N-1-(k-1)C, 2C, ..., N-1-C, kC, N-1

となる。差分を見るとffの漸化式は

f(k+1,C)=f(k,C)+SN−1−kC+SkCf(k+1, C) = f(k, C) + S_{N-1-kC}+S_{kC}

と書けるので、これに従ってDPすればよい。

ただし、同じ位置を2回通ってしまうパターンを除く必要がある。上の経路を観察すると、同じ位置を2回通るのはx,y∈{1,...,k−1}x, y \in \{1, ..., k-1\}が存在してN−1−xC=yCN-1-xC = yCとなる場合であり、これはz∈{2,3,...,2(k−1)}z \in \{2, 3, ..., 2(k-1)\}が存在してN−1=zCN-1 = zCが成り立つのと同値である。つまり、CCがN−1N-1を割り切り、かつ 2≤(N−1)/C≤2(k−1)2 \le (N-1)/C \le 2(k-1)である場合を除けばよい。

超えるべきハードルがいくつかあるので、コンテスト中に解けるようになるのは大変そう。