多项式与生成函数重谈
梦到什么写什么,这一块东西太多了,所以持续更新。
毕竟是重谈所以就只是记录一些重要的和新的内容,基础性的内容就略过了。
封闭形式的展开
麦克劳林展开
简单来说,\(f(x)=\sum\limits_{i=0} \dfrac{f^{(i)}(0)x^i}{i!}\)。这可以解决大部分常见函数了。
简单分式的展开
以下的分式展开形式从左往右和从右往左都比较常用。
-
\(\dfrac{1}{1-x}=\sum\limits_{i=0}^{\infty}x^i\)
-
\(\dfrac{1}{1-x^k}=\sum\limits_{i=0}^{\infty}x^{ik}\)
-
\(\dfrac{1}{1-ax}=\sum\limits_{i=0}^{\infty}a^ix^i\)
-
\(\dfrac{1}{1-ax^k}=\sum\limits_{i=0}^{\infty}a^ix^{ik}\)
本质上对第一个换元就可以了。这里也可以看出 \(\dfrac{1}{1-x}\) 可以作为前缀和算子。
高次分式的展开
以二次式为例,展开 \(\dfrac{1}{(p-x)(q-x)}\)。
待定系数,设 \(\dfrac{1}{(p-x)(q-x)}=\dfrac{A}{p-x}+\dfrac{B}{q-x}\),通分解出来即可。
而对于分母里有 \((p-x)^k\) 之类的东西,在设系数的时候可以设 \(\dfrac{A_1}{p-x}+\dfrac{A_2}{(p-x)^2}+\cdots+\dfrac{A_k}{(p-x)^k}\),看起来更舒服。
递推式展开
有的时候并不好写通项,但是如果能写出递推式也能高效解决问题。
一种方法是列出 ODE 对比系数(事实上有的时候 ODE 不好解出封闭形式,但是容易得到递推式)。对于一些形式上特殊或者简单的封闭形式,可能通过一些变换很快就能得到递推式。例如形如 \(\dfrac{1}{C+Bx+Ax^2}=\sum\limits_{i=0}^{\infty}a_ix^i\),移项卷积可以得到 \(a_0=\frac{1}{C},a_1=-\frac{B}{C^2},a_n=-\frac{B}{C}a_{n-1}-\frac{A}{C}a_{n-2}\)。
[CERC2015] Frightful Formula
边界上的贡献是简单的。主要是对 \(\sum\limits_{i=0}^{n-2}\sum\limits_{j=0}^{n-2}\dbinom{i+j}{i}a^ib^j\) 的处理。当然可以卷积做。
考虑 GF 写递推或通项,\(F(x)=\sum\limits_{i=0}^{n-2} \dfrac{a^ix^i}{i!},G(x)=\sum\limits_{i=0}^{n-2} \dfrac{b^ix^i}{i!}\),令 \(H(x)=F(x)G(x)\),所求即为 \(\sum\limits_{i=0}^{2n-4} i![x^i]H(x)\)。
两边同时求导得:
代入 \(f_i=i![x^i]H(x)\) 化为递推式:
于是做完了。
其它方法
包括但不限于二项式定理展开高次二项式等。
组合意义
对于 OGF \(\dfrac{1}{1-F(x)}\),与 EGF \(\exp F(x)\) 的组合意义。
OGF 组合意义
\(G(x)=\sum\limits_{i=0}^{\infty}F^i(x)=\dfrac{1}{1-F(x)}\),\(F(x)=1-\dfrac{1}{G(x)}\)。
放两道比较经典的题,可以直观感受上面两个式子的组合意义。
QOJ7766 栞
这里谈特殊性质 \(q=(1,2,\cdots,n)\)。
先考虑判定,此时对于一个 \(p\) 的划分可以贪心:假设前面分好了 \(1\sim i\),当前段必须是从 \(i+1\) 开始的值域连续的一段。所以每次贪心找到最小的满足条件的段,看最后分出来的段是否 \(\geq k\) 个,因为相邻两个段显然是可以合并的。
于是问题转变为如何求一个极小段的方案数。注意到方案数与最小值无关,只与段的长度有关,不妨设最小值为 \(1\),长度为 \(n\) 的方案数为 \(f_n\)。此时对于一个排列 \(a\),即要求不存在一个前缀 \(a_1\sim a_i\),使得这个前缀的值域为 \(1\sim i\)。
到这里可以直接枚举最小的 \(i\) 进行容斥:\(f_n=n!-\sum\limits_{i=1}^{n-1}f_i(n-i)!\)。但是这里可以利用 OGF 的组合意义:对于一个排列 \(p\),一定是分成了若干极小段 \(p_1,p_2,\cdots,p_k\)。令 \(F(x)=\sum f_ix^i\),有等式 \(n!=[x^n]\sum\limits_{i=0}^{\infty}F^i(x)\)。若令 \(G(x)=\sum i!x^i\),有 \(G(x)=\dfrac{1}{1-F(x)}\)。可以解出 \(F(x)=1-\dfrac{1}{G(x)}\),和上面容斥的式子是一样的。顺带一提上面那个式子稍微变一下就是暴力求逆的式子,需要关注常数项。
CF1093F 加强版
考虑容斥,钦定若干连续段,连续段的容斥系数和其长度相关,设容斥系数的生成函数 \(F(x)\)。目标是 \(1\sim \text{len}-1\) 能够被算 \(1\) 次,其它算 \(0\) 次,考虑连续段拼接的组合意义,要求容斥系数之积的和,则有 \(\sum\limits_{i=0}^{\infty}F^i(x)=\sum\limits_{i=1}^{\text{len}-1}x^i\)。写成封闭形式:\(\dfrac{1}{1-F(x)}=\dfrac{1-x^{\text{len}}}{1-x}\),解得 \(F(x)=\dfrac{x-x^{\text{len}}}{1-x^{\text{len}}}\)。考虑展开这个简单分式,\(\dfrac{x}{1-x^{\text{len}}}\) 表示 \(n\bmod \text{len}=1\) 时系数为 \(1\),\(\dfrac{-x^{\text{len}}}{1-x^{\text{len}}}\) 表示 \(n\bmod\text{len}=0\land n>0\) 时系数为 \(-1\),其它系数为 \(0\)。后面的 dp 部分是平凡的。
EGF \(\exp\) 组合意义
相对来说更为常见,用得太多比较熟悉就不写了。\(\ln\) 是 \(\exp\) 的逆运算(如说)。
大概就是 \(\exp F(x)=\sum\limits_{i=0}^N \dfrac{F^i(x)}{i!}\),和 OGF 相比带标号,所以有个 \(\frac{1}{i!}\) 来除序。
顺带说一下暴力求 \(\exp\) 和 \(\ln\):
设 \(G(x)=\exp F(x)\),两边同时求导得:\(G'(x)=F'(x)\exp F(x)\),即 \(G'(x)=F'(x)G(x)\)。比对 \(n\) 次项系数:\(ng_n=\sum\limits_{i=1}^n if_ig_{n-i}\)。
于是得到 \(g_n=\frac{1}{n}\sum\limits_{i=1}^n if_ig_{n-i}\),\(f_n=g_n-\frac{1}{n}\sum\limits_{i=1}^{n-1}ig_if_{n-i}\)。
二维 FFT
二元多项式卷积。
一个很直观的想法是对一维做先做 DFT,然后在这一维做点乘的时候第二位套用多项式乘法。这是对的,但是在两维大小相差较大时常数很大,效率堪忧。
另一个做法是先对每一行做 DFT,再对每一列做 DFT,点乘之后对每一列做 IDFT,最后对每一行做 IDFT。这样需要 \(6\) 次 FFT。
更优秀的做法是考虑占位变为一元多项式卷积。具体来说,令 \(p\) 为 \(y\) 在卷积后可能的最大次数,将 \([x^iy^j]\) 视作 \([z^{i(p+1)+j}]\) 的一元多项式进行卷积然后还原就可以了。这样只需要 \(3\) 次 FFT,非常优秀。
Bostan-Mori 算法
从一个问题引入:求 \([x^m]\dfrac{P(x)}{Q(x)}\),\(m\) 很大,\(P,Q\) 是不超过 \(n\) 次的多项式。
Hint:上下同乘 \(Q(-x)\),后面的过程就很自然了。
此时分母只剩偶次项,不妨设分母 \(Q(x)Q(-x)=G(x^2)\),分子 \(P(x)Q(-x)=F_0(x^2)+xF_1(x^2)\)。分讨 \(m\) 的奇偶性,若 \(m\) 为偶数,只有 \(F_0(x^2)\) 的部分有用;否则只有 \(xF_1(x^2)\) 的部分有用。这样把问题归约到了一个 \([x^{\lfloor\frac{m}{2}\rfloor}]\dfrac{F(x)}{G(x)}\),继续递归直到 \(m=0\) 可以直接得到结果。计算 \(F,G\) 需要卷积,每次 \(m\) 减半,时间复杂度 \(O(\mathsf{M}(n)\log m)\)。
于是可以解决求解分式远处系数的问题,其广泛的应用在下面会看到,先放例题。
ABC436G Linear Inequation
这很像付公主的背包:\(\prod\limits_{i=1}^N \dfrac{1}{1-x^{A_i}}\)。由于是 \(\leq M\) 需要再做前缀和,所求即为 \([x^M]\dfrac{1}{(1-x)\prod\limits_{i=1}^N (1-x^{A_i})}\)。\(M\) 太大了没有办法直接求逆,把分母先分治卷出来,然后套用 Bostan-Mori 即可。
【模板】常系数齐次线性递推
取 \(Q(x)=1-f_1x-f_2x^2-\cdots-f_kx^k\),\(P(x)=A\times Q\bmod x^k\)。用 Bostan-Mori 求 \([x^n]\dfrac{P(x)}{Q(x)}\) 即可。
Power Projection
问题引入:对 \(0\leq i\leq n\) 求 \([x^n]F^i(x)\),\(F\) 是 \(n\) 次多项式。
引入 \(y\) 来占位,等价于对于 \(0\leq i\leq n\) 求 \([x^ny^i]\sum\limits_{i=0}^ny^iF^i(x)\)。这么做的好处是可以缩到一起:\([x^ny^i]\frac{1}{1-yF(x)}\),然后可以仿照 Bostan-Mori 进行递归求解,只不过求的东西从数变成了关于 \(y\) 的多项式(所以需要二维 FFT)。
在递归的第 \(i\) 层,由于 \(x\) 次数大于 \(n\) 时不再有意义(所求只需要 \([x^n]\),这也是与分式远处系数不一样的地方),\(x\) 的次数不超过 \(\frac{n}{2^i}\),\(y\) 的次数不超过 \(2^i\),时间复杂度 \(O(M(n)\log n)\)。
ABC439G Sugoroku 6
整体思路比较简单,关键在于科技是否点够了。
令 \(f_i\) 为前 \(i\) 轮还没有赢的概率。对一轮骰子摇出来点数的概率,有生成函数 \(F(x)=\dfrac{1}{M}\sum\limits_{i=1}^M x^{A_i}\),\(F^i(x)\) 即表示 \(i\) 轮后走到某个位置的概率。于是 \(f_i=\sum\limits_{k=0}^{N-1}[x^k]F^i(x)\),乘上前缀和算子 \(\dfrac{1}{1-x}\) 变为 \([x^{N-1}]\dfrac{F^i(x)}{1-x}\)。这是 Power Projection 的形式,只不过多乘了一个 \(\dfrac{1}{1-x}\),将其展开为 \(\sum\limits_{i=0}^{N-1}x^i\) 放到分子上照常做 Bostan-Mori 即可求出 \(f\)。
后半部分比较简单,是对每个 \(i\) 计算 \(\sum\limits_{k=1}^N (f_{k-1}-f_k)f_k^{i-1}f_{k-1}^{L-i}\)。考虑到对 \(1\leq i\leq L\) 都要求答案,又有个求和的 \(k\),所以大致的思路是写出这东西的 GF \(G_k(x)\),\([x^i]G_k(x)\) 表示 \(k\) 对 \(i\) 的贡献,这样所求即为 \([x^i]\sum\limits_{k=1}^N G_k(x)\)。将关于 \(i\) 的式子处理成一项:\(\sum\limits_{k=1}^N (f_{k-1}-f_k)f_{k-1}^{L-1}\left(\dfrac{f_k}{f_{k-1}}\right)^{i-1}\),答案可以表示成:\([x^{i-1}]\sum\limits_{k=1}^N \dfrac{(f_{k-1}-f_k)f_{k-1}^{L-1}}{1-\frac{f_k}{f_{k-1}}x}\),分治卷一起(维护分式可以保证项数与区间长度同阶)就完了。
时间复杂度 Power Projection 与分治卷积均为 \(O(\mathsf{M}(N)\log N)\)。
形式幂级数/多项式复合
先记一个从 Power Projection 转置的做法,再学多项式省选真的要无了。
求 \(f(g(x))\bmod x^n\),其中 \(f,g\) 次数小于 \(n\)。
显然对 \(f\) 来说这是线性变换,假设输出为 \(Ab\),有矩阵 \(A_{i,j}=[x^j]g^i(x)\),\(b\) 是 \(f\) 形成的列向量。
转置原理考虑 \(A^Tb\) 的计算,\(A^T=[x^i]g^j(x)\)。需要对 \(0\leq j<n\) 求出 \(\sum\limits_{i=0}^{n-1}b_i[x^i]g^j(x)\)。这是 Power Projection 的形式,构造分子 \(h(x)=\sum\limits_{i=0}^{n-1}b_ix^{n-i}\),化成标准形式 \([x^ny^j]\dfrac{h(x)}{1-yg(x)}\),套 Bostan-Mori 即可。

浙公网安备 33010602011771号