多项式
1. 多项式乘法(卷积)
简单来说,选取 \(\omega_n^k\) 代入,DFT 转化成点值表达式后相乘后再 IDFT。
把 FFT 的 \(\omega_n^k\) 换成 \(g^{\left\lfloor\frac{mod-1}{n}\right\rfloor}\),其中 \(g\) 为 \(mod\) 的原根。
模板
P1919 【模板】A*B Problem 升级版(FFT 快速傅里叶变换):注意处理进位。
P4245 【模板】任意模数多项式乘法:可以考虑使用三模数 NTT,用 CRT 合并。
循环移位或子串匹配问题
[ABC291G] OR Sum:按位计算每个循环移位的贡献,翻转 \(B\),做异或卷积即可。异或卷积可以拆成两个加法卷积。
[ABC196F] Substring 2:同样是快速计算每个位置开始匹配的最大匹配位数,翻转 \(T\) 后做加法异或卷积。
CF993E Nikita and Order Statistics:翻转序列后转化为循环移位问题,注意 NTT 会爆模数,使用 FFT。
P4173 残缺的字符串:对于这种一般性的字符集为全部小写字母的子串匹配问题,考虑构造多项式 \(\sum\limits_{i=0}^n \sum\limits_{j=0}^m (s_i - t_j)^2 s_i t_j\),如果字符为通配符那么值为 \(0\),否则为它是第几个小写字母。拆式子后做三遍加法卷积即可。
CF528D Fuzzy Search:字符集小,枚举每个字符,设什么 \(f(c)_i\) 为原串第 \(i\) 个字符能不能匹配到 \(c\),01 加法卷积即可。
CF1334G Substring Search:转化成 \(\sum (s_i - t_j)^2 \times (s_i - p_{t_j})^2\) 即可。
[ABC307Ex] Marquee:可以转化成 P4173 残缺的字符串即带通配符的字符串匹配问题,具体见 我写的题解。
推式子
P3338 [ZJOI2014]力:第一部分设 \(a_i = q_i, b_i = \frac{1}{i^2}\),求 \(\sum\limits_{i=0}^{n-1} \sum\limits_{j=0}^i a_j \times b_{i-j}\) 即可,第二部分翻转数组后再做一次。
P5488 差分与前缀和:推出 \(j \to i\) 的贡献系数后加法卷积,具体见 我写的题解。
P5641 【CSGRound2】开拓者的卓识:和上一题差不多,考虑 \(j \to 1\) 和 \(j \to i\) 的方案数,那么 \(s_i = \sum\limits_{j=1}^i \binom{j+k-2}{k-1} \times \binom{i-j+k-1}{k-1} \times a_j\),直接加法卷积即可。
[ARC124F] Chance Meeting:考虑减小规模,只计算在 \((n, i)\) 相遇方案数,然后容斥计算方案数,发现转移式是加法卷积形式。具体见 我写的题解。
[ABC267Ex] Odd Sum:不能直接暴力跑背包,发现值域很小,对值域从小到大做背包,还需要加上上界优化。具体见 我写的题解。
[ARC153E] Deque Minimization:经过一坨转化后转化为 \(k\) 阶前缀和,具体见 我写的题解。
P5395 第二类斯特林数·行:根据斯特林数通项公式 \({n \brace m} = \sum\limits_{i = 0}^m \frac{(-1)^{m - i} i^n}{i! (m - i)!}\) 计算即可。
P4091 [HEOI2016/TJOI2016] 求和:根据斯特林通项公式拆式子,化成加法卷积形式即可。
P6667 [清华集训2016] 如何优雅地求和:利用二项式反演将点值转化为类似系数的东西,卷积优化。具体见 我写的题解。
[AGC047C] Product Modulo:利用原根化乘为加,转化为 \(\sum\limits_{i + j = k} A_i A_j\) 形式,FFT 优化即可。
倍增
P5408 第一类斯特林数·行:运用 \(\prod\limits_{i = 0}^{n - 1} (x + i) = \sum\limits_{i = 0}^n \begin{bmatrix} n \\ i \end{bmatrix} x^i\) 计算,考虑倍增,假设计算了 \(x^{\overline n}\),可以推得 \(x^{\overline{2n}} = x^{\overline n} (x + n)^{\overline n}\)。可推得 \((x + n)^{\overline n}\) 是一遍差卷积。
CF960G Bandit Blues:利用组合意义简化求和式,转化为求第一类斯特林数。具体见 我写的题解。
上述二者综合
P3723 [AH2017/HNOI2017]礼物:设差为 \(k\),则 \(ans = \sum\limits_{i=1}^n (x_i - y_i + k)^2 = \sum\limits_{i=1}^n x_i^2 + y_i^2 + k^2 + 2 x_i k - 2 y_i k - 2 x_i y_i\),发现循环移位只会对 \(\sum\limits_{i=1}^n x_i y_i\) 造成影响,先提前计算它的最大值,再枚举 \(k\) 计算最大值即可。
2. 多项式快速幂
指数很小的时候直接对点值求 \(k\) 次方即可,也可以倍增。如果是倍增,注意清空数组。
固定选的物品个数的背包
CF1096G Lucky Tickets:构造多项式之后快速幂即可。
CF286E Ladies' Shop:感觉略有难度。一个 \(T\) 能成为答案当且仅当 \(\forall x \in T\),\(x\) 在 \(S\) 中不能分解成两个及以上数的和,根据题目要求可以将规模减小到两个数,如果这些数能凑出 \(\le m\) 且 \(\notin S\) 的数就无解。构造多项式求平方即可。
其他
P3321 [SDOI2015]序列统计:利用原根化乘为加,求 \(n\) 次幂即可。具体见 我写的题解。
[ARC139E] Wazir:转换后变成对于 \(b_i = a_i - a_{i + 1} = \pm 1\) 计数,当 \(m \le 10^5\) 时构造多项式 \(f(x) = (x + x^{-1})^n \pmod{x^m - 1}\) 求它的常数项,可以直接多项式快速幂。具体见 我写的题解。
[ABC309Ex] Simple Path Counting Problem:把 dp 状态对称一份后做多项式快速幂,就可以保证边界的 dp 值等于 \(0\)。具体见 我写的题解。
P5219 无聊的水题 I:根据树的度数限制转化为对度数序列计数,容斥一下转化为最大度数 \(\le m\) 计数,使用多项式快速幂。
[ABC303Ex] Constrained Tree Degree:和上一题类似。
3. 分治 NTT
当需要做在线卷积时,就需要分治 NTT。分治 NTT 的核心思想是,计算出 \(f_{l \sim mid}\),卷上 \(g_{0 \sim r - l}\) 转移至 \(f_{mid + 1 \sim r}\)。
模板
应用
[ABC213H] Stroll:直接分治 NTT 即可,具体见 我写的题解。
[ABC247Ex] Rearranging Problem:写出 \(O(n^2)\) dp 转移式,转化成 \(n\) 个一次多项式相乘,分治优化。具体见 我写的题解。
[ABC281Ex] Alchemy:一种很神奇的分治 NTT。具体见 我写的题解。
CF1257G Divisor Set:答案为本质不同的大小为 \(\left\lfloor\frac{n}{2}\right\rfloor\) 的子集个数。考虑写成若干个多项式乘起来,最后取 \(\left\lfloor\frac{n}{2}\right\rfloor\) 次项。容易分治 NTT 优化。
P5644 [PKUWC2018] 猎人杀:可转化为 0/1 背包,转化为求若干个多项式乘积,分治 NTT 优化即可。具体见 我写的题解。
P4841 [集训队作业2013] 城市规划:根据容斥写出递推公式,发现是半在线卷积形式,然后分治 FFT 即可。