多项式专题

最近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 }}\)
证明:

  • 这是一个 $n - 1$ 次多项式。右侧只有 $x$ 是变量,其余均为常数,共乘了 $n - 1$ 次。
  • 这个函数中 $n$ 个点与原函数重合。代入 $x = x_k$ ,我们发现只有 $k = i$ 时候,连乘为 $1$, 其余情况为 $0$
  • 因此,我们证明了该多项式与原多项式相等。

    优化:连续整数取值。

    变换

    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})\)

    posted @ 2022-10-14 20:07  CDsidi  阅读(39)  评论(4编辑  收藏  举报