生成函数大概是一个无穷幂级数形式的函数,我们只关心它的形式,而不会去带入 x 求值。可以看做是多项式,只是带入没有意义。它的一些运算可以对应组合意义,所以能通过它解决一些组合问题。
一般生成函数(OGF):
指数型生成函数(EGF),之后会看到为什么要定义这样的函数:
f(x)=a0+a11!x1+a22!x2+a33!x3...
重要的是要把生成函数的代数形式和组合意义对应起来:
考虑一类组合对象组成的集合
A
,给每个
加法就是组合对象的并。
乘法
定义
对应的组合意义是, SEQ(A) 是 A 中的所有元素的有序组合。
例:
A={1,2,3,...} , |i|=i ,则 SEQ(A)={正整数有序拆分}
可以等比数列求和:
关于指数生成函数(EGF):
除一个阶乘,就可以对应带标号的组合对象,其他和普通生成函数类型。
定义 SET(A)=∑∞i=0Aii! , 和 SEQ(A) 不同的是算得的是无序的方案数。
由 Taylor 展开,有 ex=1+x11!+x22!+x33!+x44!... ,所以 SET(A)=∑∞i=0Aii!=eA
差不多就这些…
重要的是如何实现多项式的某些运算:
多项式求逆:
Newton 迭代:
已知 g ,
g(f)=0 ,可以迭代出 f 。设已知
f 前 n 项,即f≡f0(modxn) , f−f0≡0(modxn)Taylor 展开得 0=g(f)=g(f0)+g′(f0)(f−f0)1!+g′′(f0)(f−f0)22!+...≡g(f0)+g′(f0)(f−f0)(modx2n)
所以 g(f0)+g′(f0)(f−f0)≡0(modx2n)→f=f0−g(f0)g′(f0)(modx2n)
也就是说由前 n 项能得到前
2n 项,每次要多项式求逆,复杂度 T(n)=T(n/2)+O(nlogn)=O(nlogn)给定 A 求
lnA :f=lnA , f′=A′A ,就好了。
给定 A 求
eA :f=eA ,设 g(x)=lnx−A ,则 g(f)=0 ,牛顿迭代即可。
【施工ing……..】