多项式专题
最近accoders天天出多项式科技题,我一道都不会,场场罚坐。气死我了, 我也要学科技。
杂项
Lagrange 插值
有 \(n\) 个点,我们试图确定一个 \(n - 1\) 次多项式。
设这 \(n\) 个点是 \((x_i, y_i )\)
这个多项式就是:
\(f(x) =\sum_{i = 1}^{n}{ y_i \prod_{i \neq j} \frac{x - x_j}{x_i - x_j }}\)
证明:
因此,我们证明了该多项式与原多项式相等。
优化:连续整数取值。
变换
FFT 快速傅里叶变换
NTT 快速数论变换
FWT 快速沃尔什变换 FMT 快速莫比乌斯变换
FWT/FMT 是处理子集卷积的利器。
我们想要快速求出 \(\operatorname{C_i} = \sum_{i = j \bigoplus k}{\operatorname{A_j} \times \operatorname{B_k}}\)
其中 \(\bigoplus\) 是 二元位运算的一种。 \(\times\) 是普通乘法。
以 OR 为例详细说明。其余的不给出详细说明。
OR 卷积
我们想快速求出 \(\operatorname{C_i} = \sum_{i = j | k}{\operatorname{A_j} \times \operatorname{B_k}}\)
0
类似FFT,我们想要构造出一个数列 \(\operatorname{FWT[...]}\),使得这个数列能够快速通过 \(\operatorname{FWT[A]}\) \(\operatorname{FWT[B]}\) 得到 \(\operatorname{FWT[C]}\)
具体地 \(\operatorname{FWT[C]_i} = \operatorname{FWT[A]_i} \times \operatorname{FWT[B]_i}\)
网上题解告诉我们。
令 \(\operatorname{FWT[A]}_i = \sum_{i = i | j}{a_j}\) 即可,子集卷积的名字就是这么来的
证明利用乘法分配率和位运算结合律,与网上题解重复部分,略。
如何快速求出:我们考虑高低位分类
考虑\(A\) 最高位为 \(0\) 的部分 \(\operatorname{A_0}\) 与最高位为 \(1\) 的部分 \(\operatorname{A_1}\) 贡献。
因为 \(A_1\) 的子集不仅包括自己,还包括 \(A_0\) 的对应部分,所以要加上指定部分。
\(\operatorname{FWT[A]} = merge(\operatorname{FWT[A_0]}, \operatorname{FWT[A_0]} + \operatorname{FWT[A_1]})\)
逆变换
\(\operatorname{B_0}\) 表示变换后序列的低位 \(\operatorname{B_1}\) 表示变换后序列的高位,考虑用 \(B\) 得到 \(A\)
\(B_0 = A_0\),$B_1 = A_1 + A_0 $
可以得到:
$ UFWT[A'] = merge(UFWT{A'_0} , UFWT[A'_1 - A'_0])$
AND 卷积
$ FWT[A] = merge(FWT[A_0] + FWT[A_1], FWT[A_1])$
$ UFWT[A'] = merge(UFWT[A_0'] - UFWT[A_1'], UFWT[A_1']) $
XOR 卷积
令 \(f(i, j)\) 为 \(\operatorname{popcount(i \& j)}\) 的奇偶性。
\(FWT[A] = \sum_{f(i, j) = 0}{A_j} - \sum_{f(i, j) = 1} {A_j}\)
\(FWT[A] = merge(FWT[A_0] + FWT[A_1], FWT[A_0] - FWT[A_1])\)
如何理解: 最高位为 \(0\) 时候,最高位不影响 $ i & j$,更不影响 \(f(i, j)\),
最高位为 \(1\) 的时候,最高位影响 \(A_1\),使其交换正负号。
\(UFWT[A'] = merge(\frac{UFWT[A'_0] + UFWT[A'_1]}{2}, \frac{UFWT[A'_0] + UFWT[A'_1]}{2})\)