beet's soil

競プロのことなど

yukicoder No.940 ワープ ε=ε=ε=ε=ε=│;p>д<│

予約投稿なので初投稿です

リンク

yukicoder.me

TL;DR;

指数型母関数と形式的べき級数を知っていますか?僕は知っています。

前提

以下では 0<X+Y+Z=N を仮定します(なんでこの制約ないねん)

ちょうど n 回の移動でたどり着く通り数を an と置きます。

まず、ちょうど n 回という条件が面倒なので、 n 回以下の移動でたどり着く通り数 bn を考えます。
重複組み合わせの公式から、bn=(X+n1n1)(Y+n1n1)(Z+n1n1) であることがわかります。
ある n に対し、 ak(k<n) が全て分かっているなら、 an=bnk=1n1(nk)ak を用いて an を求めることができます。計算量は O(N2) です。

指数型母関数サイコー!一番好きな母関数です。

以下、 f(x)=n=0anxnn!,g(x)=n=0bnxnn! とおきます。
(これは係数にbinomがあることから指数型母関数を知っていればある程度自然な発想だと思います)

すると、形式的べき級数として考えた時に、以下の等式が成り立ちます

f(x)(1+x+x2/2+x3/6...)=f(x)exp(x)=g(x)

したがって、 形式的べき級数として exp(x)exp(x)=1 であることを用いて

f(x)=g(x)exp(x)

です。今回は先頭のたかだか N 項を求めれば十分なので、 g(x)=n=0(X+n1n1)(Y+n1n1)(Z+n1n1)xnn!exp(x)=n=0(x)nn!=n=0(1)nxnn! の先頭 N 項を陽に計算し、その積を求めればいいです。

計算量はFFTなどを用いることで O(NlogN) になります。

おまけ

exp(x) の逆数を求めるのにFPSライブラリを貼るとTLEする(一敗)
FFTの精度がdoubleだと足りない(一敗)

提出URL

yukicoder.me