指数型生成函数
我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题
对于数列({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))