2019年5月28日火曜日

ABC 128 F - Frog Jump

ABC 128 F - Frog Jump

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

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

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

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

0,N1(k1)C,C,N1(k2)C,2C,...,N1C,(k1)C,N10, N-1-(k-1)C, C, N-1-(k-2)C, 2C, ..., N-1-C, (k-1)C, N-1

であり、kkを1増やすと

0,N1kC,C,N1(k1)C,2C,...,N1C,kC,N10, N-1-kC, C, N-1-(k-1)C, 2C, ..., N-1-C, kC, N-1

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

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

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

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

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