Can you stop exactly? 3

2 secs 1024 MB
YSatUT's icon YSatUT

前問の解法の計算量はO(m3logn)O(m^3\log n)なので、本問のようにmmが大きい場合は使用できません。一方で、今回は前問に比べてnnは小さいです。そこで、形式的冪級数を用います。

xxについての多項式ffxkx^kの係数を[xk]f[x^k]fと表すと、サイコロをkk回振った時に点nnに止まる確率は[xn]{1mx+1mx2++1mxm}k[x^n]\left\{\frac{1}{m}x+\frac{1}{m}x^2+\cdots+\frac{1}{m}x^m\right\}^kとなります。よって、求める確率pn=k=0[xn]{1mx+1mx2++1mxm}k=[xn]k=0{1m(x+x2++xm)}k=[xn]111m(x+x2++xm)=[xn]m(1x)m(m+1)x+xm+1p_n=\displaystyle\sum_{k=0}^{\infty}[x^n]\left\{\frac{1}{m}x+\frac{1}{m}x^2+\cdots+\frac{1}{m}x^m\right\}^k=[x^n]\displaystyle\sum_{k=0}^{\infty}\left\{\frac{1}{m}(x+x^2+\cdots+x^m)\right\}^k=[x^n]\displaystyle\frac{1}{1-\frac{1}{m}(x+x^2+\cdots+x^m)}=[x^n]\displaystyle\frac{m(1-x)}{m-(m+1)x+x^{m+1}}となります。

この記事より、形式的冪級数の逆元はO(nlogn)O(n\log n)で求めることができるので、全体の計算量はO(nlogn)O(n\log n)となり、十分時間内に間に合います。

解答例

形式的冪級数の積を求める際にmod環上での畳み込みを行うため、AC Libraryの一部を引用しました。引用した部分に関しては、解答例にその旨を明記してあります。

ans.cpp

質問・誤りがある場合

Twitterに連絡ください。ID : @YS55749378