简单多项式卷积与生成函数
FFT 与多项式求逆
P4841 [集训队作业2013] 城市规划
生成函数可以把卷积形式的式子转成无限项的多项式乘积,然后利用模某一项的多项式求逆即可算出答案。非卷积形式的式子,可以考虑往卷积形式上构造。
考虑设 \(f_i\) 表示 \(i\) 个点的简单无向连通图数目,\(g_i\) 表示 \(i\) 个点的简单无向图数目,显然有 \(g_n=2^{\frac{n(n+1)}2}\)。
组合数在里面显然没法表示成多项式乘积,因此考虑拆开:
令 \(G(n)=\frac{g_n}{(n-1)!}\),\(F(n)=\frac{f_n}{(n-1)!}\),\(H(n)=\frac{g_{n}}{(n)!}\)(这里可以理解为是多项式 \(G,F,H\) 的第 \(n\) 项系数),则有:
我们钦定 \(F(0)=G(0)=0,H(0)=1\),此时把下标起点调整到 \(0\) 后上式仍然成立:
多项式求逆即可。此题可作为多项式乘法及多项式求逆的综合模板。
P4491 [HAOI2018] 染色
二项式反演与差卷积。设 \(f(x)\) 表示恰有 \(x\) 种颜色出现了 \(s\) 次的方案数;\(g(x)\) 表示钦定了某 \(x\) 个颜色出现了 \(s\) 次的方案数的和。\(g\) 是好算的,同时可以用 \(f\) 表示 \(g\):
利用向上版本的二项式反演另一形式化简:
把组合数拆开,令 \(F(i)=f(i)\times i!\),\(G(i)=g(i)\times i!\),\(H(i)=\frac{(-1)^i}{i!}\),则有
这是一个差卷积形式,核心思想是 reverse 一个 \(G,H\) 得到和卷积形式,再对乘法得到的多项式作平移或 reverse,得到 \(F\)。具体地,令 \(Q(m-j+i)=H(j-i)\),\(P(m+i)=F(i)\),则:
注意到 \(G,Q\) 都仅有 \(0\sim m\) 有值,故这可以看作多项式乘法,NTT 即可。
P9135 [THUPC 2023 初赛] 快速 LCM 变换
考虑对每种质数 \(p\) 分别统计。假设删掉的两个数的幂次数分别为 \(x,y\),加入数的幂次数为 \(k\),\(p\) 的最高次为 \(mp\),第二高次幂为 \(smp\):
- 若 \(x>y\),则 \(k=y\),当且仅当 \(x=mp\) 时 LCM 受影响,系数为 \([x=mp]\frac{1}{p^{mp-smp}}\)(这里中括号不合法则整个式子值为 \(1\))
- 若 \(x<y\),将 \(x\) 换成 \(y\) 即可。
- 若 \(x=y\),则 \(k\geq x\),系数为 \(p^{\max(0,k-mp)}\)
你发现上面三种情况可以统一写出一个贡献系数 \([x=mp]{p^{mp-smp}}\times [y=mp]{p^{mp-smp}}\times p^{\max(0,k-mp)}\),在满足一种情况时,另外两个的值均为 \(1\)。由于不同质数之间作乘法,可以将所有 \(p\) 对应的系数先乘起来,把删去一个值为 \(x\) 的数对 LCM 的系数记为 \(f(x)\),加入一个数对 LCM 的贡献记为 \(g(x)\),再将带数量系数的删去系数记为 \(fc(x)\),则有:
NTT 优化即可。注意此时计算了选择某个数两次的情况,需要先减去。而后每个 pair 都被计算了两次,除 \(2\) 即得到真实答案。
[ABC213H] Stroll
考虑 dp,设 \(f_{i,j}\) 表示走到 \(i\),距离为 \(j\) 的方案数,转移时枚举每一个到 \(i\) 的边 \(E_x=(v,i)\),有 \(f_{i,j}\gets \sum_{k=0}^{j}f_{v,k}\times p_{x,j-k}\)。注意第一维是乱的,我们只能按照第二维递增的顺序转移。而第二维恰好是一个卷积形式,因此做分治 NTT,每一层枚举所有的边,确定 \(E_x=(v,i)\) 后,等价于 \(f(i)=f(v)*p(x)\)。复杂度 \(O(mT\log^2 T)\)。
[ABC307Ex] Marquee
不难转化为有全能通配符的字符串匹配问题。有如下两种方法:
【法一】bitset
考虑处理出每一个字符在文本串中出现的位置,设字符 \(c\) 在文本串出现的位置(或称之为可合法匹配的位置)集合为 \(S\),那么对于一个位置 \(t_i=c\)(\(t\) 是模式串,长度为 \(m\),下标从 \(1\) 开始),它带来的限制是文本串中的合法终止位置 \(p\) 必须满足 \(p-m-i\in S\),因此我们把 \(S\) 向右平移 \(m-i\) 位即可得到只考虑当前位置,合法的匹配终止位置集合。把所有限制与起来,即可得到最终答案。复杂度 \(O(\frac{n^2}{w})\)。
【法二】FFT
\(3\times 10^5\) 的数据范围对 bitset 来说略大。我们有一个更快的做法:题解 P4173 【残缺的字符串】 - 洛谷专栏
简单来说,设两个字符的不相似度 \(C(s,t)=st(s-t)^2\),通配符的 ASCII 设成 \(0\),再设两个等长串 \(S,T\) 的不相似度 \(D(S,T)=\sum_{i=1}^{|S|}C(S_i,T_i)\),则两个串可以匹配的条件就是 \(D=0\)。设 \(f_i\) 表示从文本串的 \(i\) 开始匹配模式串的不相似度,有 \(f_i=\sum_{j=1}^mC(S_{i+j},T_{j})\),展开后做差卷积即可做到 \(O(n\log n)\)。该题中 \(C\) 乘起来会比较大,所以使用 FFT 而非 NTT 实现,略有一点卡精度,复数类需要使用 long double 实现。此题可作为 FFT 模板使用。
P9773 [HUSTFC 2023] 序列配对
将问题转化为环上边定向,同一个环上可能会有 \(2x\) 个特殊点,每个特殊点贡献 \(4\),等价于我们需要选择 \(\frac k8\) 对特殊点。设 \(f_{i,j}\) 表示考虑到第 \(i\) 个环,当前特殊点个数为 \(j\) 的方案数,有:
标准的卷积形式,你发现这等价与对于每个环有一个 \(l\) 次多项式,我们要将它们以及一个初始多项式 \(f_{0,0}=1\) 相乘,所有多项式的总次数为 \(n\)。考虑合并果子的乘法,每次选择次数最小的两个相乘,每次乘的复杂度都是长度和乘上 \(\log\)。可以将其理解为线段树形式,被拼成 \(\log\) 层;也可以理解为:作为较小的,合并一次翻一倍;作为较大的,合并一次后,下一次合并的对象一定大于第一次合并前自己的长度,也即合并两次翻一倍,因此每一段的合并次数都是 \(O(\log n)\),因此总遍历次数 \(O(n\log n)\),复杂度 \(O(n\log^2 n)\)。
当然直接利用线段树结构进行分治合并也是可以的,因为每个初始多项式都会被合并 \(O(\log n)\) 次。
生成函数与多项式的综合应用
生成函数可以用来解决求若干种物品,每种选若干个来组成答案形态的方案数计数问题。
- OGF 主要用于解决背包问题,选择的不同种类物品之间没有顺序不同。
- EGF 主要用于解决排列问题,选择的不同种类物品之间有顺序的区别。注意到这样带的方案数权值为 \(\frac{tot!}{(a_1)!(a_2)!}\dots\),故把分母部分先带在每一个函数上,最后给对应系数额外乘 \(tot!\)。
P7431 [THUPC2017] 小 L 的计算题
式子没办法化简,只能考虑生成函数。生成函数的核心思路是:通过交换求和顺序、转换封闭形式等方式把函数化简成好看的形式,便于求每一次前面的系数。
我们写出 \(f\) 的 OGF:
此时直接做,由于单个多项式求逆的复杂度是 \(O(n\log n)\),仍然爆炸,所以需要进一步化简。有两个方向:
第一是可以分治合并。由于是分数,合并需要通分,要做三个乘法和一个加法。合并出来的次数是 \(O(len)\) 级别,故总复杂度可以做到 \(O(n\log^2 n)\)。
第二是可以把通分的式子写出来看:
下面这个式子可以直接分治乘法合并。上面那个式子不好看,但很容易让人联想到分母求导,得到分子每一项乘 \(-a_i\)。因此考虑往分子的每一项放一个 \(a_i\)。
因此,求出分母的多项式后,求导、给每个系数取反、再乘 \(x\)(向右平移一位)即可得到分子每一位的系数,最后仍然是多项式求逆即可。复杂度 \(O(n\log^2 n)\),由于分治时只做一次乘法,常数更小。
[ABC241Ex] Card Deck Score
可以看出来是一个很标准的背包选数的形式,于是可以设出每一种物品的选择函数 \(F_i(x)=\sum_{j=0}^{b_i}a_i^j\times x^j\),相乘得到:
我们希望求这个式子的第 \(m\) 项系数。注意前一个部分只有 \(2^n\) 项,可以暴力把每一项的系数和次数求出来,则问题变为若干个单次询问求后面一个乘积的某一次项系数。
注意此处不能求逆,因为模的次数不能只是 \(x^n\),而应当达到 \(x^m\),复杂度太大。注意到后面是一个封闭形式,可以去掉分数形式,变成无限项的加和,但前面仍然是乘积,还是有一个卷积存在,不好算。于是考虑待定系数法把乘积拆成加和。利用加和形式通分后分母与乘积形式相同,我们设出系数 \(t_i\),则有:
上面这个式子对任意 \(x\) 恒成立,任意带入 \(n\) 个 \(x\) 可以高斯消元求出所有 \(t\)。
当然,不妨令 \(x=\frac{1}{a_k}\),则当且仅当 \(i=k\) 时乘积项有值。即 \(t_k\prod_{j\ne k}(1-a_jx)=1\),于是可以直接 \(O(n)\) 求出一个 \(t\)。于是就有:
于是可以 \(O(n\log V)\) 求一个项的系数。总复杂度 \(O(2^nn\log V)\)。
P5644 [PKUWC2018] 猎人杀
首先一个经典转化:将从剩余集合里随机转化为从全集里随机,随到不在集合里的人,就跳过继续。在此题中,跳过操作显然是不对结果产生任何影响的。此时我们容易容斥算 \(1\) 不是第一个死的概率:钦定他在 \(S\) 里的人之前死,其他人任意,有:
还是不好算。注意到数据中 \(\sum w\) 很小,于是考虑枚举 \(\sum_{i\in S} w_i\),计算所有满足这个条件的集合的 \((-1)^{|S|}\) 和。这是一个背包问题,考虑 OGF 优化,每个人对应的生成函数显然是 \((1-x^{w_i})\),利用线段树结构分治合并即可。
QOJ1261.Inv 加强版
题意:问有多少个置换环长度不超过 \(2\) 的 \(n\) 的排列的逆序对数量为 \(u\)。对于 \(u\in [1,k]\) 求答案对 \(2\) 取模的结果,\(n\le 10^9,k\le 2\times 10^5\)。
结论:翻转排列中的任意一个置换环,逆序对个数不变。
证明:考虑翻转环后 \(p_i\to pos_i,p_j\to pos_j\),此时新的逆序对形如 \(i>j,pos_i<pos_j\),等价于在原来的排列上枚举两个形成逆序对的值,总数不变。
首先,对于包含长度 \(>2\) 的置换环的排列,翻转包含最小编号的不合法环可以得到一一匹配,于是转为求所有逆序对数量为 \(u\) 的排列。此时从小到大插入 dp 可以做到 \(O(nk)\)。
问题等价于有一个长度为 \(n\) 的序列,第 \(i\) 个位置可以填 \([0,i-1]\),问最后和为 \(k\) 的方案数。背包形态考虑 OGF,第 \(i\) 个位置的 OGF 为 \(\sum_{j=0}^{i-1}x^j=\frac{1-x^i}{1-x}\)。于是可以开始推式子:
我们要求的是这个式子前 \(k\) 次项系数的奇偶性。
对于前半部分,不难看出是一个插板法,\(k\) 次项系数为 \(\binom{k+n-1}{k}\),利用组合数奇偶性结论可以快速判断,即 \((k+n-1)\&k=k\) 时其为奇数,否则为偶数。
后半部分显然只有前 \(k\) 项有用。由于只维护奇偶性,可以用 bitset 把他们乘起来。最后两部分的卷积也可以用 bitset 实现。总复杂度 \(O(\frac{k^2}{w})\)。
另:对于 \(\prod_{i=1}^n(1-x^i)\) 的前 \(k\) 次项系数可以这样考虑:注意到一个值至多由 \(\sqrt k\) 个 \(x\) 组成,且其个数决定了其正负号。因此考虑对每一个幂次数的间隔从高往低 dp,也即每次决定一个已选集合是否插入一个 \(0\),并将其内的所有数 \(+1\)。设 \(f_{i,j}\) 表示当前集合内有 \(i\) 个数,总和为 \(j\) 且每个元素都小于 \(n\)的方案数。转移如下:
- 只抬高,\(f_{i,j}\gets f_{i,j-i}\)。
- 插入一个 \(0\) 再抬高,\(f_{i,j}\gets f_{i-1,j-i}\)。
- 注意到这样转移可能会有一个数被抬高到 \(n+1\),不合法了。\(f_{i,j}\gets -f_{i-1,j-n-1}\)。
可以在 \(O(k\sqrt k)\) 的复杂度内求出后面一部分的所有系数。也即如果只求一个 \(k\),可以做到 \(O(k\sqrt k)\)。
P9896 [ICPC2018 Qingdao R] Sub-cycle Graph
特判掉 \(m\geq n\) 的情况。现在等价于把 \(n\) 个点划分成 \(n-m\) 个互不区分的集合,元素之间要做区分,求每种划分的权值和。集合大小为 \(1\) 的权值为 \(1\),其余情况权值为 \(\frac{|S|!}{2}\)。
注意到元素之间要做区分,而集合之间不做区分,因此背包模型不好解决选元素的问题。考虑利用 EGF 计算集合之间区分的答案,最终除掉 \((n-m)!\) 即可。则每一个集合的 EGF 为 \(x+\sum_{i=2}\frac{x^i}{2}\),权值的阶乘和 EGF 分母的阶乘消掉了。化为封闭形式有 \(\frac{x}{2} (1+1+x+x^2+\dots)=\frac{x}{2}(1+\frac{1}{1-x})\)。因此要求的系数即为:
我们希望求后面那个求和式的 \(x^m\) 次方项的系数。注意到后面那个分式展开形如 \((1+x+x^2+\dots)^i\),其第 \(m\) 次项的组合意义为将 \(m\) 个物品插板插成成 \(i\) 个可空子集的方案数,为 \(\binom{m+i-1}{i-1}\)。故可以 \(O(n)\) 算出 \(x^m\) 项系数。总复杂度 \(O(n)\)。
P5401 [CTS2019] 珍珠
设 \(cnt_i\) 表示一种颜色的出现次数。可以化简得到一个状态合法的条件是 \(\sum_{i=1}^Dcnt_i\bmod 2\le n-2m\)。
考虑容斥,设 \(f_i\) 表示恰有 \(i\) 种颜色出现次数为奇数的方案数;\(g_i\) 表示钦定某 \(i\) 种颜色出现次数为奇数,其它任意的方案数。通过反演可以把 \(f\) 做成差卷积的形式,于是问题变为求 \(g\)。
首先,所有颜色的内部不区分顺序,但 \(n\) 个变量不同,相互之间区分顺序,考虑使用 EGF。对于钦定的和非钦定的,其 EGF 不同:
- 钦定必须为奇数的,贡献序列为 \(\{0,1,0,1,...\}\),则 \(E_1=\frac{x^1}{1!}+\frac{x^3}{3!}+\dots\),由于 \(\sum_{i}\frac{(ax)^i}{i!}=e^{ax}\),我们有 \(E_1=\frac{e^x-e^{-x}}{2}\)。
- 不钦定的,贡献序列为 \(\{1,1,1,1,...\}\),我们有 \(E_2=e^x\)。
此时,总的给 \(n\) 个位置填颜色的方案数就是若干个 \(E_1\) 和 \(E_2\) 乘积后,\(x^n\) 系数乘 \(n!\)。注意我们拿到一个含 \(e^x\) 的式子后,可以通过化简变成 \(e^{ax}\) 的形式,然后搞回无限项形式求系数。于是我们有以下化简:
是一个经典的和卷积形式。直接 NTT 即可求出所有的 \(g\)。

浙公网安备 33010602011771号