【題解】LOJ #6609 無意識的石子堆 - 感謝強大 alpha!!1【2】
阿新 • • 發佈:2022-11-30
其實只有三個部分:
- 環的 EGF:\(\frac{1}{2}\sum\limits_{i\geq 2}\frac{x^iy^i}{i}=\frac{1}{2}\left(\ln\frac{1}{1-xy}-xy\right)\) 。
- 鏈的 EGF:\(\frac{1}{2}\frac{xy^2}{1-xy}\) 。
- 點的 EGF:\(y\) 。
於是答案為:
\[\begin{aligned} ans&={}[x^n][y^m]\exp\left(\frac{1}{2}\left(\ln\frac{1}{1-xy}-xy\right)+\frac{1}{2}\frac{xy^2}{1-xy}+y\right)\\ &={}[s^n][t^{m-n}]\exp\left(\frac{1}{2}\ln\frac{1}{1-s}\right)\exp\left(-\frac{1}{2}s\right)\exp\left(\frac{1}{2}\frac{st}{1-s}+t\right)\\ &={}[s^n][t^{m-n}]\frac{1}{\sqrt{1-s}}e^{-s/2}\exp\left(\frac{1}{2}\frac{st}{1-s}+t\right)\\ &={}[s^n]\frac{1}{\sqrt{1-s}}e^{-s/2}[t^{m-n}]e^t\sum_{i\geq 0}\frac{1}{i!}\left(\frac{1}{2}\frac{st}{1-s}\right)^i\\ &={}[s^n]\frac{1}{\sqrt{1-s}}e^{-s/2}\sum_{0\leq i\leq m-n}\frac{1}{i!(n-m-i)!}\left(\frac{1}{2}\frac{s}{1-s}\right)^i\\ &={}[s^n]\frac{1}{\sqrt{1-s}}e^{-s/2}\frac{1}{(m-n)!}\left(\frac{2-s}{2-2s}\right)^{m-n}\\ \end{aligned} \]記 \(F_1=\frac{1}{\sqrt{1-s}},F_2=e^{-s/2},F_3=\left(\frac{2-s}{2-2s}\right)^{m-n}\)
拆成兩個部分:第一部分是 \(F_1F_2\),我們的任務是解決 \(e^{-s/2}\sqrt{1-s}\) 。第二部分是 \(F_3\) :
- Part 1:重定義 \(F_1\) 為 \(\sqrt{1-s}\),記 \(F=F_1 F_2\) 。\(F'=F_1'F_2+F_1F_2'\),其中 \(F_1'=\frac{1}{2\sqrt{1-x}}\),於是 \(F'=\frac{1}{2\sqrt{1-s}}e^{-s/2}-\frac{1}{2}e^{-s/2}\sqrt{1-s}\)
- Part 2:考慮令 \(G(x)=x^{m-n}\)。有 \(G'(x)=(m-n)x^{m-n-1}\),故 \((m-n)G(x)-xG'(x)=0\) 。帶入 \(F=\frac{2-s}{2-2s}\) 有 \((m-n)G(F)-F\frac{[G(F)]'}{F'}=0\) 。即 \((m-n)G(F)=(2-3s+s^2)[G(F)]'\)
時間複雜度 \(O(n+\log p)\) 。
signed main () {
IN (n), IN (m);
inv[1] = 1;
lep (i, 2, n) inv[i] = mul (mod - mod / i, inv[mod % i]);
f[0] = 1, f[1] = 0;
lep (i, 1, n - 1) f[i + 1] = mul (mul (inv2, inv[i + 1]), add (f[i - 1], mul (mul (2, i), f[i])));
const int rec = (m - n) % mod;
g[0] = 1, g[1] = mul (rec, inv2);
lep (i, 1, n - 1) g[i + 1] = mul (mul (inv2, inv[i + 1]), dec (mul (add (rec, 3 * i), g[i]), mul (i - 1, g[i - 1])));
int ret = 0;
lep (i, 0, n) pls (ret, mul (f[i], g[n - i]));
lep (i, 2, n) ret = mul (ret, i); // n !
lep (i, 1, n) ret = mul (ret, (m - i + 1) % mod); // m ! / (m - n) !
printf ("%d\n", ret);
return 0;
}