最近accoders天天出多项式科技题,我一道都不会,场场罚坐。气死我了, 我也要学科技。
Lagrange 插值#
有 n 个点,我们试图确定一个 n−1 次多项式。
设这 n 个点是 (xi,yi)
这个多项式就是:
f(x)=∑ni=1yi∏i≠jx−xjxi−xj
证明:
这是一个 n−1 次多项式。右侧只有 x 是变量,其余均为常数,共乘了 n−1 次。
这个函数中 n 个点与原函数重合。代入 x=xk ,我们发现只有 k=i 时候,连乘为 1, 其余情况为 0
因此,我们证明了该多项式与原多项式相等。
优化:连续整数取值。
FFT 快速傅里叶变换#
NTT 快速数论变换#
FWT 快速沃尔什变换 FMT 快速莫比乌斯变换#
FWT/FMT 是处理子集卷积的利器。
我们想要快速求出 Ci=∑i=j⨁kAj×Bk
其中 ⨁ 是 二元位运算的一种。 × 是普通乘法。
以 OR 为例详细说明。其余的不给出详细说明。
OR 卷积#
我们想快速求出 Ci=∑i=j|kAj×Bk
0
类似FFT,我们想要构造出一个数列 FWT[...],使得这个数列能够快速通过 FWT[A] FWT[B] 得到 FWT[C]
具体地 FWT[C]i=FWT[A]i×FWT[B]i
网上题解告诉我们。
令 FWT[A]i=∑i=i|jaj 即可,子集卷积的名字就是这么来的
证明利用乘法分配率和位运算结合律,与网上题解重复部分,略。
如何快速求出:我们考虑高低位分类
考虑A 最高位为 0 的部分 A0 与最高位为 1 的部分 A1 贡献。
因为 A1 的子集不仅包括自己,还包括 A0 的对应部分,所以要加上指定部分。
FWT[A]=merge(FWT[A0],FWT[A0]+FWT[A1])
逆变换
B0 表示变换后序列的低位 B1 表示变换后序列的高位,考虑用 B 得到 A
B0=A0,B1=A1+A0
可以得到:
UFWT[A′]=merge(UFWTA′0,UFWT[A′1−A′0])
AND 卷积#
FWT[A]=merge(FWT[A0]+FWT[A1],FWT[A1])
UFWT[A′]=merge(UFWT[A′0]−UFWT[A′1],UFWT[A′1])
XOR 卷积#
令 f(i,j) 为 popcount(i&j) 的奇偶性。
FWT[A]=∑f(i,j)=0Aj−∑f(i,j)=1Aj
FWT[A]=merge(FWT[A0]+FWT[A1],FWT[A0]−FWT[A1])
如何理解: 最高位为 0 时候,最高位不影响 i & j,更不影响 f(i,j),
最高位为 1 的时候,最高位影响 A1,使其交换正负号。
UFWT[A′]=merge(UFWT[A′0]+UFWT[A′1]2,UFWT[A′0]+UFWT[A′1]2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】