生成函数浅谈
羊驼说,要当老师,所以强大的羊驼教会了我们生成函数。
羊驼说,我们有卷积,所以生成函数的问题通常可以在带 \(log\) 的时间复杂度内解决这类问题。
普通型生成函数
数列 \(1,1,1,1,1,1\) 的普通型生成函数就是 \(1+x+x^2+x^3+x^4+x^5\)。
而数列 \(1,1,\cdots,1,1,\cdots\) 的普通型生成函数就是 \(1+x+x^2+x^2+\cdots +x^n+\cdots\)。
羊驼说,写成展开形式形式太麻烦,所以羊驼教会了我们封闭形式。
设 \(F(x)=1+x+x^2+x^3+x^4+x^5\)
则 \(xF(x)=x+x^2+x^3+x^4+x^5+x^6\)
所以 \(F(x)=\frac{1-x^6}{1-x}\)
对于无穷数列也是同理,我们可以假定它收敛,得到封闭形式。
设 \(F(x)=1+x+x^2+\cdots\)
则 \(xF(x)=x+x^2+x^3+\cdots\)
所以 \(F(x)=\frac{1}{1-x}\)
下面是一些常用的无穷数列普通型生成函数的封闭形式和展开形式的对应关系:
\(a_i=p^i [x^i],F(x)=\frac{1}{1-px}\)
\(a_i=[x^{pi}],F(x)=\frac{1}{1-x^p}\)
\(a_i=(i+1)[x^i],F(x)=\frac{1}{(1-x)^2}\)
\(a_i=\binom m i [x^i],F(x)=(1+x)^m\)
\(a_i=\binom {i+m-1} {m-1} [x^i],F(x)=\frac{1}{(1-x)^m}\)
指数型生成函数
羊驼说,她不会组合数,所以就有了指数型生成函数。
\(1,1,\cdots\) 的指数型生成函数就是 \(1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots\)
指数型生成函数通常用来消掉组合数中的阶乘,并且一般是无穷数列。
对于指数型生成函数的封闭形式和展开形式来说,二者对应关系如下:
因此,指数型生成函数的封闭形式通常是 \(e\) 的幂次。
下面是一些常用的无穷数列指数型生成函数的封闭形式和展开形式的对应关系:
\(a_i=\frac{[x^i]}{i!},F(x)=e^x\)
\(a_i=(-1)^i\frac{[x^i]}{i!},F(x)=e^{-x}\)
\(a_i=\frac{[x^{2i}]}{2i!},F(x)=\frac{e^x+e^{-x}}{2}\)
\(a_i=\frac{[x^{2i+1}]}{(2i+1)!},F(x)=\frac{e^x-e^{-x}}{2}\)
于是我们就学会了生成函数。
例题
羊驼说,要有例题,所以我们来到了 P2000 拯救世界。
两位大神的召唤方法显然都可以写成封闭形式,只要约一下分,就可以得到最终的封闭形式。
\(kkksc03\):
金:\(F(x)=\frac{1}{1-x^6}\)
木:\(F(x)=\frac{1-x^{10}}{1-x}\)
水:\(F(x)=\frac{1-x^6}{1-x}\)
火:\(F(x)=\frac{1}{1-x^4}\)
土:\(F(x)=\frac{1-x^8}{1-x}\)
\(lzn\):
金:\(F(x)=\frac{1}{1-x^2}\)
木:\(F(x)=\frac{1-x^2}{1-x}\)
水:\(F(x)=\frac{1}{1-x^8}\)
火:\(F(x)=\frac{1}{1-x^{10}}\)
土:\(F(x)=\frac{1-x^4}{1-x}\)
乘起来可得:
再转换回展开形式:
答案即为 \(\binom {n+4} 4\)。
可以用 \(NTT\) 加速高精度。
羊驼说,这种板子题太简单,所以就有了 P4841 城市规划
我们枚举 \(1\) 节点所在的连通块大小,设 \(f(x)\) 是合法连通图数量,\(g(x)\) 是合法图数量,则可得 \(g(n)=\sum_{i=1}^n \binom {n-1} {i-1} f(i)g(n-i)\)
同时我们已知 \(g(n)=2^{\binom n 2}\),开始推柿子。
\(\begin{alignedat}{2}2^{\binom n 2}&=\sum_{i=1}^n \binom {n-1} {i-1} f(i)2^{\binom {n-i} 2}\\ \frac{2^{\binom n 2}}{(n-1)!}&=\sum_{i=1}^n \frac{f(i)}{(i-1)!}\frac{2^{\binom {n-i} 2}}{(n-i)!} \end{alignedat}\)
写出生成函数:
多项式求逆即可。
斐波那契通项公式
绝帆看到没有斐波那契通项公式,非常不满,所以连夜来补一下。
我们知道斐波那契的递推式是 \(f_n=f_{n-1}+f_{n-2}\)。
写成生成函数的形式:\(f_n[x^n]=f_{n-1}[x^{n-1}]+f_{n-2}[x^{n-2}]\)。
接下来就是推柿子:
要求通项公式,下一步就应该要展开了,但是我们背的展开公式中并没有这个,所以要想办法变为见过的样子。
分母处是一个二次多项式,看起来能拆成 \((1-p_1x)(1-p_2x)\) 的形式,那么试一下。
\(\Delta=b^2-4ac=5\),所以 \(p_1=\frac{1+\sqrt 5}{2},p_2=\frac{1-\sqrt 5}{2}\)。
得到 \(\frac{1}{1-x-x^2}=\frac{\frac{1+\sqrt 5}{2\sqrt 5}}{1-\frac{1+\sqrt 5}{2}x}+\frac{\frac{1-\sqrt 5}{2\sqrt 5}}{1-\frac{1-\sqrt 5}{2}x}=\frac{1}{\sqrt 5}(\frac{1+\sqrt 5}{2}\frac{1}{1-\frac{1+\sqrt 5}{2}x}+\frac{1-\sqrt 5}{2}\frac{1}{1-\frac{1-\sqrt 5}{2}x})\)。
现在拆项,得到 \(f_n=\frac{1}{\sqrt 5}((\frac{1-\sqrt 5}{2})^{n+1}+(\frac{1+\sqrt 5}{2})^{n+1})\)。
如果必要需要扩域。
泰勒展开
如果 \(f(x)\) 在 \(x_0\) 处存在 \(n\) 阶导,那么有 \(f(x)=f(x_0)+\frac{f^1(x_0)}{1!}(x-x_0)+\frac{f^2(x_0)}{2!}(x-x_0)^2+\cdots+\frac{f^n(x_0)}{n!}(x-x_0)^n+\xi\)。
\(\xi\) 是余项,在 \(n\) 趋近于 \(\infty\) 的时候趋近于 \(0\)。
\(x_0=0\) 的 Taylor 展开又被称作麦克劳林级数。
多项式运算之牛顿迭代
一个多项式运算可以看作求解 \(F(B(x))\equiv 0\bmod x^{2^t}\),令 \(B_t\) 表示一个合法解,\(t=0\) 时可以简单算出,考虑用 \(B_t\) 求出 \(B_{t+1}\)。
利用 \(F(B_{t+1}(x))\) 在 \(B_t(x)\) 处的泰勒展开,得到 \(F(B_{t+1}(x))\equiv F(B_t(x))+\frac{F'(B_t(x))}{1!}(B_{t+1}(x)-B_t(x)) \bmod x^{2^{t+1}}\),后面的项数模意义下为 \(0\),不用管。
化简得 \(B_{t+1}(x)\equiv B_t(x)-\frac{F(B_t(x))}{F'(B_t(x))} \bmod x^{2^{t+1}}\),倍增计算即可。
多项式求逆
\(F(B(x))=A(x)\cdot B(x)-1\) 模意义下为 \(0\)。
\(\begin{alignedat}{3} B_{t+1}(x)&=B_t(x)-\frac{F(B_t(x))}{F'(B_t(x))}\\ &=B_t(x)-\frac{A_{t+1}(x)B_t(x)-1}{A_{t+1}(x)}\\ &=B_t(x)-B_t(x)(A_{t+1}(x)B_t(x)-1)\\ &=2B_t(x)-A_{t+1}(x)B_t^2(x) \end{alignedat}\)
多项式开根
\(F(B(x))=B^2(x)-A(x)\) 模意义下为 \(0\)。
\(\begin{alignedat}{3} B_{t+1}(x)&=B_t(x)-\frac{F(B_t(x))}{F'(B_t(x))}\\ &=B_t(x)-\frac{B_t^2(x)-A_{t+1}(x)}{2B_t(x)}\\ &=\frac{1}{2}(B_t(x)-\frac{A_{t+1}(x)}{B_t(x)}) \end{alignedat}\)
多项式 exp
\(F(B(x))=\ln(B(x))-A(x)\) 模意义下为 \(0\)。
\(\begin{alignedat}{3} B_{t+1}(x)&=B_t(x)-\frac{F(B_t(x))}{F'(B_t(x))}\\ &=B_t(x)-\frac{\ln(B_t(x))-A_{t+1}(x)}{\frac{1}{B_t(x)}}\\ &=B_t(x)(1-\ln(B_t(x))+A_{t+1}(x)) \end{alignedat}\)
更多技巧
- 多个式子的乘积不好做,求 \(\ln\) 加起来,再求 exp。
付公主的背包
显然一个物品的生成函数是 \(\frac{1}{1-x^{v_i}}\),现在我们需要把它乘起来求第 \(m\) 项的系数。
发现 \(\prod\limits_{i}\frac{1}{1-x^{v_i}}\) 非常不好做,可以先求 \(\ln\) 相加,再用 NTT exp 回去。
设 \(f(x)=\ln\frac{1}{1-x^v}=\ln\sum\limits_{i=0}^\infty x^{vi}\),那么 \(f'(x)=(1-x^v)(\sum\limits_{i=1}^\infty vi\times x^{vi-1})=\sum\limits_{i=1}^\infty v\times x^{vi-1}\),最后积分得 \(f(x)=\sum\limits_{i=1}^\infty \frac{x^{vi}}{i}\)。
还有更神仙的做法,因为 \(\ln(1+x)\) 的麦克劳林级数是 \(\sum\limits_{i=1}^\infty\frac{(-1)^{i+1}}{i}x^i\),所以 \(\ln\frac{1}{1+x}\) 的麦克劳林级数是 \(\sum\limits_{i=1}^\infty\frac{(-1)^i}{i}x^i\),把 \(x\) 代换为 \(-x^v\) 得 \(\ln\frac{1}{1-x^v}=\sum\limits_{i=1}^\infty\frac{x^{vi}}{i}\)。
本文来自博客园,作者:mikefeng,转载请注明原文链接:https://www.cnblogs.com/mikefeng/p/17367986.html

浙公网安备 33010602011771号