首页 > 技术文章 > 指数型生成函数小记

Charlie-Vinnie 2021-12-19 21:53 原文

面对“$n$ 个数中选 $k$ 个数”之类的问题,脑子里第一个想到指数型生成函数。

重要技巧:进行一个游戏,进行的期望次数=Σ(进行 i 次还没有停止的概率)。

证明:阿贝尔变换即可。

于是就可以设 $P(i)$ 为进行 $i$ 次的概率,令 $F(z)=\sum\limits_{i \geq 0} P(i)z^i$,则答案为 $F(z)$ 的系数和。

特别地,对于指数型生成函数,求的就是 $F(z)=\sum\limits_{i \geq 0} P(i)\frac{z^i}{i!}$ 的系数和。

然后就是利用 $e^z=\sum\limits_{i \geq 0} \frac{z^i}{i!}$ 无限转有限,即 $\sum\limits_{i \geq k} \frac{z^i}{i!}=e^z-\sum\limits_{i=0}^{k-1} \frac{z^i}{i!}$

然后多项式乘法,得到 $F(z)=\sum\limits_{i=0}^{k-1} G(z)e^{i/k}$,其中 $G(z)$ 是关于 $z$ 的多项式。

拆出来,即求一些

$ c_j z^j \sum\limits_{i \geq 0} \frac{(pz)^i}{i!} $

$ = c_j \sum\limits_{i \geq 0} p^i \frac{z^{i+j}}{i!} $

注意我们要求的是 $\frac{z^k}{k!}$ 的系数,所以上面式子的贡献是……

$ = c_j \sum\limits_{i \geq 0} p^i \frac{(i+j)!}{i!} $

$ = c_j j! \sum\limits_{i \geq 0} {i+j \choose i} p^i $ 

$ = c_j j! (\frac{1}{1-p})^{j+1}$ (具体数学教了你什么?)

哈哈完事(注意要有 $0 \leq p < 1$)

以上步骤可以 $O(n^3)$ 内完成~

推荐阅读