指数型生成函数 及 多项式求ln

指数型生成函数

我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题

对于数列({a_n}),我们定义其指数型生成函数为

[G(x) = a_0 + a_1x + a_2frac{x^2}{2!} + a_3frac{x^3}{3!} + a_4frac{x^4}{4!} + dots = sumlimits_{i = 0}^{infty} a_ifrac{x^i}{i!} ]

那么对于两个数列({a_n})({b_n}),其对应成生成函数为

[G(x) = sumlimits_{i = 0}^{infty} a_ifrac{x^i}{i!} ]

[F(x) = sumlimits_{i = 0}^{infty} b_ifrac{x^i}{i!} ]

那么

[egin{aligned} F(x) centerdot G(x) &= (sumlimits_{i = 0}^{infty} a_i frac{x^i}{i!})(sumlimits_{i = 0}^{infty} b_i frac{x^i}{i!}) \ &= sumlimits_{n = 0}^{infty} (sumlimits_{i = 0}^{infty} frac{a_ix^i}{i!} centerdot frac{b_{n - i}x^{n - i}}{(n - i)!})x^n \ &= sumlimits_{n = 0}^{infty} (sumlimits_{i = 0}^{infty} {n choose i} a_i b_{n - i}) frac{x^n}{n!} end{aligned} ]

由此可见两个指数型生成函数相乘,如果(x^i)的系数表示的是选择(i)个该物品的方案数,那么(F(x) centerdot G(x))(x^i)的系数表示的就是从(a)(b)中选出(i)个物品的排列数

一般地,对于多重集合(M),从中选取(k)个元素的排列数,若限定元素(a_i)出现的次数集合为(M_i),则该组合数序列的生成函数为

[prodlimits_{i = 1}^{n}(sumlimits_{m in M_i} frac{x^m}{m!}) ]

泰勒展开式

通常,在指数型生成函数的使用过程中,一般都会用到泰勒展开式:

[e^{x} = sumlimits_{i = 0}^{infty} frac{x^i}{i!} = 1 + x + frac{x^2}{2!} + frac{x^3}{3!} + frac{x^4}{4!} + dots + frac{x^n}{n!} + dots ]

扩展的一些式子:

[frac{e^x + e^{-x}}{2} = sumlimits_{i = 0}^{infty} frac{x^{2i}}{(2i)!} ]

[frac{e^x - e^{-x}}{2} = sumlimits_{i = 0}^{infty} frac{x^{2i + 1}}{(2i + 1)!} ]

还有一些比较有用的公式:

[frac{1}{1 - x} = sumlimits_{i = 0}^{infty} x^i ]

[ln(1 + x) = sumlimits_{i = 0}^{infty} (-1)^{i} frac{x^{i + 1}}{i + 1} ]

[(1 + x)^{a} = sumlimits_{i = 0}^{infty} a^{underline{i}}frac{x^i}{i!} ]

[sin(x) = sumlimits_{i = 0}^{infty} (-1)^{i}frac{x^{2i + 1}}{(2i + 1)!} ]

[cos(x) = sumlimits_{i = 0}^{infty} (-1)^{i}frac{x^{2i}}{(2i)!} ]

多项式求(ln)

意义?
我们要求将一个集合大小为(n)的方案数,逆向思考
假如我们求出了生成函数(F(x)),其中(x^i)项的系数表示集合大小为(i)的方案数
我们构造一个函数

[G(x) = frac{F(x)}{1!} + frac{F^2(x)}{2!} + frac{F^3(x)}{3!} + dots ]

观察式子发现(G(x))(x^i)的系数实际上就是选出若干集合大小刚好为(i)的方案数
假设这个方案数很好求,我们能很快构造出(G(x)),我们现在要求(F(x))的话就要使用多项式求(ln)
观察

[G(x) = frac{F(x)}{1!} + frac{F^2(x)}{2!} + frac{F^3(x)}{3!} + dots = e^{F(x)} ]

[F(x) = lnG(x) ]

求法

假如我们要求(G(x) = lnF(x))
求导得

[G'(x) = frac{F'(x)}{F(x)} ]

[G(x) = int frac{F'(x)}{F(x)} dx ]

所以我们只需多项式求导,多项式求逆,多项式乘法,多项式积分
复杂度(O(nlogn))

例题BZOJ3456城市规划

原文地址:https://www.cnblogs.com/Mychael/p/9187796.html