概要

命名にあたって rack up という動詞を私は初めて知りました.

小課題 11 は全探索を用いて解くことができます.
小課題 22 において AC を得るためには,少し視点を変えてみる必要があるかもしれません.

問題原案:kusirakusira
改題:FplusFplusF, uni_kakurenbo

解説

小課題 11

現実的な実行時間で 4K4^K 通りをシミュレーションすることは難しいので,代わりに各 i(1iN)i \scriptsize \; (1 \leq i \leq N) について,最終的に 点 ii に至るような移動経路の個数を求め,それに PiP_i を掛けたものを合計することを考えましょう.

題中の 44 つの向きへの移動はそれぞれ 左, 右, 下, 上 への移動と呼ぶことにします.

原点から 座標 (x,y)(x', y') に至る,長さ KK の経路がいくつあるか考えます.

それぞれの方向への移動が l,r,d,ul, r, d, u 回ずつあったとします. このとき,以下がすべて成り立ちます:

  • l+r+d+u=Kl + r + d + u = K
  • rl=xr - l = x'
  • ud=yu - d = y'

この 33 つの連立式は 44 つの元を持つので,どれか 11 つの元を固定すると他 33 つの元は一意に定まります.
ここでは uu を固定してみます.

また,上式の辺々を足し合わせることによって以下を得ます:

  • 2(u+r)=K+x+y2(u + r) = K + x' + y'

t=12(K+x+y)t = \frac{1}{2}(K + x' + y') とすると,r=tur = t - u と表されます.

以上を用いて,

  • l=tuxl = t - u - x'
  • r=tur = t - u
  • d=uyd = u - y'

l,r,dl, r, dK,x,y,uK, x, y, u によって表すことができました.

また,44 方向へそれぞれ l,r,d,ul', r', d', u' 回移動するような経路の総数は以下のように表されます:

  • (l+r+d+u)!l!r!d!u!\displaystyle \frac{(l' + r' + d' + u')!}{l'! \, r'!\, d'!\, u'!}

移動回数は非負の整数であることを考えると,結局,この問題の答えは以下に等しいことが分かります:

  • 1iN0uK2ti0(mod2)0li(u),ri(u),di(u)K ⁣ ⁣ ⁣ ⁣ ⁣ ⁣ ⁣ ⁣ ⁣PiK!li(u)!ri(u)!di(u)!u!\displaystyle \Large \sum_{\substack{1 \leq i \leq N \\ 0 \leq u \leq K \\ 2 t_i \equiv 0 \pmod 2 \\ 0 \leq l_i(u), r_i(u), d_i(u) \leq K}} \!\!\!\!\!\!\!\!\! P_i \, \frac{K!}{l_i(u)!\, r_i(u)!\, d_i(u)!\, u!}
    • ただし
      • ti=12(K+Xi+Yi)t_i = \frac{1}{2}(K + X_i + Y_i)
      • li(u)=tiuXil_i(u) = t_i - u - X_i
      • ri(u)=tiur_i(u) = t_i - u
      • di(u)=uYid_i(u) = u - Y_i

この値は,答えの法を PP として, Θ((N+logP)K)\Theta((N + \log P)K) 時間などで求めることができます.

おまけ

0l,r,d,uK0 \leq l, r, d, u \leq K という条件ですが,実は 0l,r,d,u0 \leq l, r, d, u だけで十分です.

  • 0l,r,d0l+r+d0KuuK0 \leq l, r, d \therefore 0 \leq l + r + d \Leftrightarrow 0 \leq K - u \Leftrightarrow u \leq K
  • 0l,r,u0l+r+u0KddK0 \leq l, r, u \therefore 0 \leq l + r + u \Leftrightarrow 0 \leq K - d \Leftrightarrow d \leq K
  • 0l,d,u0l+d+u0KrrK0 \leq l, d, u \therefore 0 \leq l + d + u \Leftrightarrow 0 \leq K - r \Leftrightarrow r \leq K
  • 0r,d,u0r+d+u0KllK0 \leq r, d, u \therefore 0 \leq r + d + u \Leftrightarrow 0 \leq K - l \Leftrightarrow l \leq K

から従います.

小課題 22

※以下の解説中では度々 tt の文字が登場しますが,前項の tt とは別物ですのでご注意ください.

ベースとなるアイディアは Easy と変わらず,最終的に 点 ii に至るような移動経路の個数に PiP_i を掛けたものを合計することを考えます.

以下の問題を高速に解く方法を考えてみましょう:

  • 原点から 座標 (X,Y)(X, Y) に至る,長さ KK の経路は何通りあるだろうか?

MojaMoja 君の座標を (x,y)(x', y') とします.
すると,どの方向に 11 回移動しても (x+y)mod2(x' + y') \bmod 2 の値は変化することが分かりま す.
ゆえに (X+Y)≢K(mod2)(X + Y) \not\equiv K \pmod 2 である場合,答えは 00 です.

また明らかに,X+Y>KX + Y > K である場合も到達は不可能なため,答えは 00 です.

さらに,「原点から (X,Y)(X, Y) に至る,長さ KK の経路の個数」と「原点から (X,Y)(-X, Y) に至る,長さ KK の経路の個数」や「原点から (X,Y)(X, -Y) に至る,長さ KK の経路の個数」はすべて一致しますから,0X0 \leq X かつ 0Y0 \leq Y としても一般性は保たれます.

したがって,以下では 0X,Y0 \leq X, Y かつ X+YKX + Y \leq K かつ X+YK(mod2)X + Y \equiv K \pmod 2 である場合のみを考えます.

ここで,もし X+Y=KX + Y = K であるならば,簡単に答えが求まることに着目します.
X+Y=KX + Y = K であるときとそうでないときに分けて考えてみましょう.

X+Y=KX + Y = K のとき

原点から (X,Y)(X, Y) へ至る最短経路の個数が答えであるので,XX 個の および YY 個の を一列に並べるときの並べ方が何通りあるかを考えればよく,答えは (KX)\begin{pmatrix} K \\ X \end{pmatrix} 通りです.

  • なお ()\begin{pmatrix} \cdot \\ \cdot \end{pmatrix} は二項係数であり,任意の 22 非負整数 n,rn, r に対して (nr)=n!r!(nr)!\displaystyle \begin{pmatrix} n \\ r \end{pmatrix} = \frac{n!}{r! (n - r)!} が満たされる.

X+Y<KX + Y < K のとき

うまく X+Y=KX + Y = K の場合を利用できないでしょうか?

ここでは以下の事実に注目してみましょう:

  • x+ykx + y \leq k かつ x+yk(mod2)x + y \equiv k \pmod 2 なる任意の 33 非負整数 x,y,kx, y, k に対して,(x,y)(x, y)x+y=kx' + y' = k なる 33 非負整数 x,y,tx', y', t を用いて (x,y)=(xt,yt)(x, y) = (x' - t, y' - t) と表すことができる.
  • また,このとき 2t=k(x+y)2t = k - (x + y) である.

これは次のように証明できます:

  • f(x,y)=x+yf(x, y) = x + y とする.
  • f(x+t,y+t)=f(x,y)+2tf(x + t, y + t) = f(x, y) + 2t であり,f(x,y)Kf(x, y) \leq K かつ f(x,y)f(x+t,y+t)(mod2)f(x, y) \equiv f(x + t, y + t) \pmod 2 であることから,このような非負整数 tt は必ず存在する.
  • なお,2t=k(x+y)2t = k - (x + y) であることは以上の議論から明らか.

さて,(X,Y)=(Xt,Yt)(X+Y=K)(X, Y) = (X' - t, Y' - t) \scriptsize \; (X' + Y' = K) と表されるとき,「原点から (X,Y)(X, Y) に至る,長さ KK の経路」は何通りあるでしょうか.

少し考えると,これは以下の問題の答えに一致することが分かります:

  • 『原点から (X,Y)(X', Y') へ至る最短経路 (, の並び) にそれぞれに対して,「 に置き換えるか, に置き換える」という操作をちょうど tt 箇所について行ったとき,最終的な , , , の並び方は何通りあるだろうか.』
    • 置き換えを行う前の移動経路 (, の並び) は相異なるので,その相異なる 22 文字 , をそれぞれまた相異なる , に置き換える操作によって得られる , , , の並びも,同様に相異なることが分かる.

ここで,置き換えを行う tt 箇所の選び方は (Kt)\begin{pmatrix} K \\ t \end{pmatrix} 通りありますから,X=X+tX' = X + t であることを踏まえると,はじめの問題に対して X+Y<KX + Y < K のときの答えは次のように表されます:

  • (KX+t)(Kt)\begin{pmatrix} K \\ X + t \end{pmatrix} \begin{pmatrix} K \\ t \end{pmatrix}

なお,X+Y=KX + Y = K のとき t=0t = 0 であることから,この結果は,X+Y=KX + Y = K の場合についても成り立ちます.

以上の議論を総じて,結局,この問題を,答えの法を PP として,Θ(N+KlogP)\Theta(N + K \log P) 時間などで解決できることがわかりました.

おまけ

この問題においては,ϕΦϕ(K)105\sum_{\phi} \Phi_{\phi}(K) \leq 10^5 という制約がありますから,テストケースごとに O(N+K)O(N + K) 時間程度をかけることが可能ですが,Φ\Phi 個のテストケースに答える前に,1k1 \leq k \leq なるすべての kk について k!k! の値をあらかじめ求めておくことで,答えの法を PP として,この前計算に Θ(KlogP)\Theta(K \log P) 時間,各テストケースの処理に Θ(N)\Theta(N) 時間 などで解くことができます.

解説:uni_kakurenbo

実装例

C++
C++