生成函数
1 OGF
OGF,也就是普通型生成函数,可以帮助我们解决一些数列问题,组合问题。
对于一个数列 \(
那么,我们发现,这个函数 \(A(x)\) 的加减对应着数列的加减。
如果乘上一个 \(x\),那么 \(x\cdot A(x)=\sum_{i\ge 0}a_ix^{i+1}\),也就是说,对应到数列上,相当于右移了一位,变成 \(<0,a_0,a_1,\dots>\)。
同理,除掉一个 \(x\) 也对应左移操作。
根据这个性质,我们可以处理一些简单问题:
问题 1.1:利用生成函数求出斐波那契数列的通项公式。
众所周知,斐波那契数列的递推公式为:\(F_i=\begin{cases}1&(i\le1)\\F_{i-1}+F_{i-2}&(i\ge 2)\end{cases}\)
那么,假设斐波那契数列的 OGF 为 \(F(x)\),则:
然后,把 \(F(x)\) 当成未知数,\(x\) 当参数,就可以解方程了,就能得出 \(F(x)\) 的有限项代数式。
然后就是老套路了,我们把 \(\dfrac1{1-x-x^2}\) 写成 \(\dfrac{R}{1-rx}+\dfrac{S}{1-sx}\) 的形式,就可以利用等比数列求和公式展开了。
假设我们已经求出来了,那么,我们就能够得到:
接下来唯一的问题就是求出 \(R,S,r,s\) 了。
我们通分:\(\dfrac{R(1-sx)+S(1-rx)}{(1-rx)(1-sx)}=\dfrac{1}{1-x-x^2}\),分子分母每一项都对应,所以得到:
解出来就行。
问题 2.2:利用生成函数求出卡特兰数的通项公式。
虽然之前我们已经用经典翻折容斥求出了卡特兰数的通项公式,但是,我们同样可以用生成函数求出。
我们已经知道卡特兰数的递推公式:\(C_0=1,C_{n+1}=\sum_{i=0}^{n}C_iC_{n-i}\),发现这个就是一个卷积形式,但有不完全是,卷积完之后向右移了一位。
所以,假设卡特兰数的 OGF \(C(x)=\sum\limits_{i\ge0}C_ix^i\),那么:
发现这里有正负号,到底取那个呢?
我们考虑把 \(x=0\) 的情况带进去,那么 \(C(0)=C_0=1\)。
我们发现,\(\lim\limits_{x\rightarrow 0}\dfrac{1\pm\sqrt{1-4x}}{2x}=\lim\limits_{x\rightarrow 0}\dfrac{2}{1\mp\sqrt{1-4x}}\),所以舍去正号解,所以 \(C(x)=\dfrac{1-\sqrt{1-4x}}{2x}\)。
那么我们应该如何展开呢?
我们之前提过广义二项式定理,在这里就派上用场了。
至此,我们的工作就结束了,我们得出 \(C_n=n\dbinom {2n}n\),和我们之前的结论一致。
问题 1.3(P2000 拯救世界):
题目太长,懒得写
题目其实非常简单,可以直接每一项上 OGF,用等比数列求出,全部乘起来即为答案,最后结果发现都可以约掉,剩下 \(\dbinom n4\),然后就是高精度了。
练习:
P6694 强迫症
CF438E The Child and Binary Tree
P4451 [国家集训队]整数的lqp拆分
2 EGF
EGF 是指指数型生成函数,与 OGF 不太相同的生成函数。废话
我们假设一个无限数列 \(
为什么要这么设呢?暂时保留这个问题,看到后面就会知道了。
问题 2.1:探究指数型生成函数进行一些函数的基本操作的性质。
我们探究一下这个指数型生成函数的性质:
加减法就不多说了,如果我们给 \(A(x)\) 乘上一个 \(x\) 会发生什么事呢?
也就是说,乘法操作会使数列从 \(
目前来说,还不清楚这个操作有什么用。最起码笔者并不会。
如果对 \(A(x)\) 进行求导呢?
我们发现,对函数 \(A(x)\) 求导之后,数列 \(
同理,用同样的方法,我们也可以推出:指数型生成函数的积分对应数列的右移操作。具体证明这里就不放了。
如果是卷积操作呢?
上面的 \(i!\) 是为了保持指数型生成函数的队形。也就是说,我们能够得到这样的式子:
我们发现 \(\dfrac{n!}{i!j!}\) 可以写成组合数的形式:
也就是说,指数型生成函数的卷积对应的是类似于组合问题,可以考虑组合含义,解决一些计数问题。
至此,我们开头提出来的问题已经解决:
EGF 可以用来求解任意组合问题。
EGF 相关形式会有一些封闭式,和泰勒展开有关。因为笔者太菜,不太会证明,所以就直接放结论了。
还有就是在前面提过的广义二项式定理,也会经常出现:
也可以写成这个形式:
我们定义下降次幂(FFP)为:
对于有序,有标号之类的题目,就可以考虑使用 EGF 了。
下面我们来看几道 EGF 的例题。
例题 2.2(P2012 拯救世界2):一个长度为 \(n\) 的串,有 \(12\) 中不同的元素,其中有 \(4\) 中只能出现奇数次,另外还有 \(4\) 种只能出现偶数次,求该串的方案数。
我们发现,这一道题对比 P2000 的区别就是字符串有序,所以我们采用 EGF。
三种串,我们假设 \(f_n\) 表示正常元素构成一个长度为 \(n\) 的串的方案数,\(g_n\) 表示只能出现奇数次的,\(h_n\) 表示只能出现偶数次的。那么显然有:
设 \(A_n\) 为长度为 \(n\) 的串的答案,
然后答案显然就可以枚举每一种选了多少个:
显然就是上面 EGF 卷积的形式,所以我们直接设三个函数的 EGF 为 \(F(x),G(x),H(x)\),
根据前面的式子,我们就可以发现:\(F(x)=e^x,G(x)=\dfrac{e^x+e^{-x}}2,H(x)=\dfrac{e^x-e^{-x}}2\)。
那么答案的 EGF \(A(x)=(F(x)G(x)H(x))^4\),
然后就是这一题稍微有点卡常,需要优化一下,把这些东西全部手算一下,写个光速幂。
还有就是本题模数是 1e9
,不是质数,要用扩展欧拉定理。
例 2.3(CF891E Lust):你有一个数列 \(a_1,a_2,\dots,a_n\),答案初始为 \(0\),你要对数列进行 \(k\) 次操作,每次随机选择一个数 \(x \in [1,n]\),把 \(a_x\) 减一,并将答案增加除 \(a_x\) 外所有数的乘积,求出最终答案的期望。
我们发现这个答案的统计好像很难处理,考虑转化,每一次增加的答案其实就是操作前后 \(\prod a_i\) 的乘积的差,所以我们要求的问题可以这样描述:
有一个数列 \(a_1,a_2,\dots,a_n\),和 \(n\) 个初始为 \(0\) 的数 \(c_1,c_2,\dots,c_n\),\(k\) 次操作,每次选一个 \(c_i\) 增加 \(1\),求 \(\prod a_i-\prod(a_i-c_i)\) 的期望对 \(1e9+7\) 取模。
期望问题有一个常见求法就是转化为每种方案的和除以方案总数。方案总数显然是 \(n^k\),所以我们只需要求出每种方案的和即可。
我们发现这个操作是有序的,比如先操作一次 \(c_1\),再操作一次 \(c_2\) 和先操作一次 \(c_2\),在操作再次 \(c_1\) 算作不同方案,虽然最后结果相同。
因此可以考虑 EGF。
整理一下前面的思路,设 \(Ans\) 表示答案,那么:
上面的组合数就是每一种 \(c_i\) 的划分方式的方案数。
我们可以定义一个 \(a_i-c_i\)的 EGF:
拆开计算:
显然,如果设 \(g_k=\sum_{\sum c_i=k}\dbinom{k}{c_1,c_2,\dots,c_n}\prod (a_i-c_i)\),那么 \(g_k\) 的 EGF \(G(x)=\prod f_i(x)\)。
也就是说,我们要求出上面这个多项式的 \(x^k\) 项系数。
假设我们已经求出了一个多项式 \(H(x)=\prod_{i=1}^n(a_i-x)=\sum_{i=0}^n h_ix^i\),接下来我们把 \(e^{nx}\) 展开成 \(\sum_{i\ge0} \dfrac{n^ix^i}{i!}\),那么:
于是,我们可以通过递推 \(O(k)\) 计算出这部分答案,最后记得乘以 \(k!\)。
至于 \(H(x)\) 怎么求,可以分治 NTT
做到 \(O(n\log^2n)\),但是本题模数为 \(1e9+7\),需要MTT
,并且 \(n\le 5000\),所以我选择直接 \(O(n^2)\) 暴力卷积!
练习:
P5748 集合划分计数
P4841 [集训队作业2013]城市规划
P7364 有标号二分图计数
P6295 有标号 DAG 计数
P5401 [CTS2019] 珍珠
P5206 [WC2019] 数树