指数生成函数

指数生成函数用来解决 多重集排列问题


问题
\(n\) 种物品,每种物品有 \(a_i\) 个,问取 \(m\) 个的排列数

这个排列数的写法可以写为 \(\frac{m!}{b_1!b_2!b_3!...b_n!}\)
\(b_i\) 表示第 \(i\) 种物品选 \(b_i\)
对于每种物品,得得到它的指数生成函数为 \(\sum_{j = 0}^{a_i}\frac{x^j}{j!}\)
把它们相乘(卷积),\(x\)的指数是总共选择的个数,形如\(\frac{x^m}{b_1!b_2!b_3!...b_n!}(\sum b = m)\)
由于指数生成函数可以转化为\(\frac{x^m}{b_1!b_2!b_3!...b_n!}= \frac{m!}{b_1!b_2!b_3!...b_n!} \times \frac{x^m}{m!}\)
可知,卷积之后\(\frac{x^m}{m!}\)项的系数就是这个问题的答案

接下来解释一下代码是如何实现的。
首先,在构建指数生成函数的时候,要用浮点数存每项的\(\frac{1}{i!}\)
卷积之后,指数为 \(m\) 的项的系数再乘一个 \(m!\) 就能得到每种 \(b\) 的分配下的排列数的和

posted @ 2025-11-11 22:02  he_jie  阅读(3)  评论(0)    收藏  举报