日记 2024.3.22:生成函数
日记 2024.3.22:生成函数
定义
例题
\(m\) 种小球,要取出 \(n\) 个。
- 每种小球各一个,\(\dbinom m n\) 或者 \([x^n](1+x)^m=\dbinom m n\)。
- 每种小球无限多个,\(\dbinom{m+n-1}{m-1}\) 或者 \([x^n]\dfrac{1}{(1-x)^m}\)(就是 \(\dfrac{1}{1-x}=1+x+x^2+\cdots\))。
广义二项式定理:\((x+y)^r=\sum_{k=0}^{\infty}\dbinom{r}{k}x^ky^{r-k}\)。\(\dbinom r k=\dfrac{r^{\underline k}}{k!}\),\(r\) 可以是实数。
提取 \([x^n]\) 的系数。
运算法则
数乘
一个数列 \(\{a_i\}\) 的生成函数为 \(F(x)\),则 \(\{ca_i\}\) 的生成函数为 \(cF(x)\)。
加法
两个数列对应相加的生成函数就是各自的生成函数相加。
右移
一个数列,往前面补 \(k\) 个零,生成函数 \(\times x^k\)。
求导
一个数列 \(\{a_0, a_1, a_2, \cdots\}\) 的生成函数为 \(F(x)\),则 \(\{a_1, 2a_2, 3a_3, \cdots\}\) 的生成函数为 \(F'(x)\)。
例子
因为全部是 \(1\) 的数列是 \(F(x)=\dfrac{1}{1-x}\)。求导一次变成 \(F'(x)=-(1-x)^{-2}(-1)=\dfrac{1}{(1-x)^2}\),即数列 \(\{1, 2, 3, 4, \cdots\}\)。
然后再次求导,再做一次右移。用到求导的除法法则。然后就得到了 \(\{0, 1, 4, 9, 16, 25, \cdots\}\)。
乘法
就是卷积。
计算数列
1. \(2^n-1\)
\(f_0=0, f_i=2f_{i-1}+1\),求生成函数。
将 \(F(x)\) 的每项系数写出来,写 \(n\) 行,然后左边求和,右边求和。
提取 \([x^n]\) 得到 \(2^n-1\)。
2. 斐波那契数列
\(f_0=0, f_1=1, f_i=f_{i-1}+f_{i-2}\)。求生成函数。
待定系数,声称
可以直接计算出 \(a, b\),进而计算 \(A, B\)。分子为 \(x\)。
然后展开这个分式,太阴间了,反正就是 \([x^n]\dfrac{\beta}{1-\alpha x}=\alpha^n\beta\) 提取某一项系数的一个基本工具。(\(\alpha, \beta\) 为数)
估计它的增长,将其中一个 \(<1\) 的根的 \(n\) 次方直接忽略,然后就可以发现它大概以 \(1.618\) 增长。
这里具体写一下过程了。
这种东西听说有深刻做法,即用韦达定理构造出根为 \(a, b\) 的一元二次方程,即 \(t^2-t-1=0\),解得(不妨 \(a<b\))
从而考虑分子:
所以
提取 \([x^n]\) 项系数得到
3. Catalan 数列
Catalan 数列,\(f_0=1, f_n=\binom{2n}{n}/(n+1)=\sum_{i=0}^{n-1}f_if_{n-i-1}\)。求生成函数。
解方程:
考察 \(F(0)=1\),但是如果取 \(+\) 号,\(F(0)=\frac{1+1}{0}\)。取 \(-\) 号,\(F(0)=\frac{0}{0}\) 洛必达法则可以使它 \(=1\)。所以
下一步是展开,我的天有点阴间,等一会。就是拆开,然后广义二项式定理,注意这个 \(\frac{1}{2x}\) 特别阴间。
考虑
所以
所以
最后一步,吸收恒等式。
所以 \(f_i=\dbinom{2n}n/(n+1)\)。
一般的情况
尝试递归刻画 \(F(x)\),下一步刻画成分式,下一步阴间展开,展开成分母只有一次的分式或应用广义二项式定理。
例题
1. 整数的 lqp 拆分
\(g_n=f_n+\sum_{i=1}^{n-1}f_ig_{n-i}\) 表示 \(n\) 的答案,\(f_i\) 是斐波那契数列。
我们定义 \(g_0=1\)。这样以后
解得
这个时候 Bostan-Mori 算法已经可以解决,但是更进一步的,设 \(a<b\) 为 \(x^2+2x-1\) 的两个根。
所以
这里,\(a, b=\frac{-2\pm2\sqrt 2}{2}=-1\pm\sqrt 2\),所以 \(A=\frac{2+\sqrt 2}{4}, B=\frac{2-\sqrt 2}{4}\)。所以
大概这种状物。不想验算。感觉不如背 Bostan-Mori 算法。
2. P3978 概率论
求一个 \(n\) 个点的有根二叉树的叶子节点个数的期望。记答案为 \(h_n\)。
左右子树各卷对方的 Catalan 一次。\(h_0=0, h_1=1\)。
我们已知
解得
广义二项式定理。看上去和 Catalan 数列通项公式推导是本质相同的。
3. 拆分问题
将 \(n\) 拆分为若干个 \(2, 3, 4\) 的和,可以重复选,只关心重数,不关心顺序,求方案数。令答案为 \(g\)。
令
因为 \(H(x)\) 项数很少,考虑以 \(H(x)\) 求 \(G(x)\)。因为 \(G(x)H(x)=1\)。所以
除非 \(n=0\),此时 \(h_0g_0=1\)。
这是一个齐次的线性递归式。我服了这玩意直接 Bostan-Mori 算法带走。或者矩阵快速幂也行的。反正 \(10\) 项怎么递推都行了。
4. CF506E 简化版
设 \(p, q\leq 200\)。\(p\) 个字符串,\(s_1, \cdots, s_p\),字符集 a-z
。\(q\) 个字符串,\(t_1, \cdots, t_q\),字符集 a-y
。字符串 \(r\) 的字符集为 a-z
:长度不限可以为空。总长度为 \(L\)。求方案数。设答案为 \(g_L\)。
倒数
\(O(401^3\log L)\) 的矩阵快速幂。
5. UOJ 未知题号的简化版
CPOJ::master SS240226C
左拐度 \(\leq m\) 的 \(n\) 节点二叉树计数,左拐度就是所有叶子到根的经过的左儿子的次数的最大值。令答案为 \([x^n]F_m(x)\)。快速刻画得到答案好像是这个:
假装 \(F_m(x)=A_m(x)/B_m(x)\)。明显 \(A_m(x)=B_{m-1}(x)\),因为等一会要上下同乘 \(B_{m-1}(x)\)。
所以
矩阵快速幂优化递推。但是,这个矩阵的快速幂快不了一点!考虑插 \(m\) 个点值,因为 \(B_m(x)\) 的项数不超过 \(m\)。
然后可以插回去,回去了以后 Bostan-Mori 算法。
五边形数定理
定义
五边形数定理:
第 \(n\) 个五边形数就是 \((3n^2-n)/2\),\(n\) 可以为负数。以下是 \(Q(x)\) 的前几项:
证明参见 五边形数定理的一种证明——visit_world。
1. [NOI Online #1 入门组] 跑步
问有多少个单调不减的正整数序列的和恰好为 \(n\)。即求 \(n\) 的拆分数。记答案的生成函数为 \(P(x)\)。
所以直接对 \(Q(x)\) 求逆 \(O(n\log n)\)。但是更加好写的 \(O(n\sqrt n)\) 是说,因为 \(Q(x)\bmod x^{n+1}\) 只有 \(O(\sqrt n)\) 项(因为五边形数是 \(O(n^2)\) 的),考虑对 \(P(x)Q(x)\) 提取 \([x^n]\) 系数:
就是直接枚举左边看一下右边配哪一项。然后就可以递推了。每一个 \(P_n\) 都要求,\(O(n\sqrt n)\)。
2. 完美的拆分
计数长为 \(n\) 的排列,恰有 \(k\) 个逆序对,多测,\(n\leq 10^9, k\leq 10^3, T\leq 10^2\)。
首先这个排列,是按照值域从小到大插入数字。数字 \(i\) 可能产生 \(0\) 到 \(i-1\) 个逆序对。\(i\) 从 \(1\) 开始。
分子用五边形数定理,分母保留前 \(k\) 项,我不管这玩意怎么做了。可能因为当时还没有 Bostan-Mori 算法,现在有了,直接暴力应用。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18090370