FFT & NTT
P5641 【CSGRound2】开拓者的卓识
对于每一组 \(k = 1\) 计算贡献即可。
然后发现这是可以 \(NTT\) 卷的,然后就AC了。
P4351 [CERC2015]Frightful Formula
对于每一个第一行和第一列的点算一下对答案的贡献,然后算一下在每一个点加上的 \(c\) 对答案的贡献。
这个贡献是 \(\sum\limits_{i=0}^{n-2} \sum\limits_{j=0}^{n-2} a^i b^j C_{i+j}^{i}\)。这个东西用 \(MTT\) 算即可。
CF958F3 Lightsabers (hard)
启发式合并,每次选取最短的两个合并起来,然后 FFT 卷起来即可。
P4389 付公主的背包
生成函数, 然后可以考虑先 Ln 然后再 Exp 回去。\(\ln(1 - x^V)\) 是有性质的,然后经过 推导 即可得到答案
P5488 差分与前缀和
生成函数,以前缀和为例,生成函数为 \((1 + x + x^2 + ..)^k\) ,可用组合数直接求。
P5748 集合划分计数
首先枚举有多少个集合,得到指数级生成函数 \(F = \sum\limits_{i = 0} \frac{x^i}{i!} = e^x\), 不包含 \(0\), 因此为 \(e^x - 1\)
那么答案就是这个再做一遍指数级生成函数,为 \(e^{e^x - 1}\)。
CF1251F Red-White Fence
随便搞,枚举红栅栏。然后启发式合并加 FFT 即可
P5395 第二类斯特林数·行
简单的二项式反演,然后用 \(NTT\) 优化即可。
P6800 【模板】Chirp Z-Transform
把这个 \(c^{ij}\) 拆分成 \(c^{\binom{i + j}{2}} (\frac{1}{c})^{\binom{i}{2}} (\frac{1}{c})^{\binom{j}{2}}\),然后把 \(j\) 给翻转一下就可以卷了。
CF827E Rusty String
FFT 做字符串匹配。对于每一个 \(k\) 计算 \(s_k = \sum\limits_{i = 0}^{n - k} f_i f_{i + k} (f_i - f_{i + k})^2\)。如果 \(s_k = 0\) 表示匹配成功。(如果是通匹符 \(f_i = 0\))
长度为 \(i\) 的循环节如果可行,当且仅当 \(s_{k}, s_{2k} ...\) 都可行(为 \(0\))。
P7330 [w33z-2018] Dream Fourier Transform
考虑把序列分成 \(f_0(x), f_1(x) ... f_{63} (x)\)。\(f_k(x) = \sum\limits_{i = 0}^{63} a_{64i + k} x^i\)。对于每一个多项式 \(FFT\) 算出 \(\omega_{64}^i\) 的值。
查询时吧 \(\omega_{64}^{k}\) 带入每一个多项式计算。修改时对于他所属的多项式进行修改即可。
CF1334G Substring Search
简单的卷积匹配。link
倍增 FFT
CF623E Transforming Sequence
首先有一个 \(O(n k^2)\) 的 dp。可以倍增优化到 \(O(k^2 log n)\)。用 FFT 可以继续优化到 \(O(n log k log n)\)
CF755G PolandBall and Many Other Balls
十分显然的倍增 \(FFT\), 在 \(dp\) 上随便搞点小优化即可。
CF773F Test Data Generation
比较难想的倍增 FFT, 需要一些生成函数。推导
循环卷积
其 证明
P4191 [CTSC2010]性能优化
基础的循环卷积。分治过程是 这样 的。然后直接把 \(A\) 的点值乘以 \(B\) 的点值的 \(m\) 次方即可。
奇怪的知识
暴力 exp
\(g_{n} = \sum\limits_{i = 1}^{n} \frac{i}{n} g_i f_{n - i}\)
奇怪的分治 FFT
\(f_i = h_i \sum\limits_{j = 0}^{n- 1} f_j g_j f_{i - 1 - j} g_{i - 1 - j}\)
这个在左端点不为 \(0\) 时得到值要乘以 \(2\)。