快速沃尔什变换(FWT)
快速沃尔什变换(FWT)
前言
本文为个人学习笔记,大量参考了 oi-wiki 以及其他博客的内容。
问题
给定 序列,求:
其中,。
做法
核心思想
对于某种特定的 ,找到序列 分别对应序列 ,需要满足以下性质和要求:
1、;
2、需要在优秀的时间复杂度内进行 和 的变换。
下面一个一个符号来。
考虑 和 的变换,考虑分治处理,写出如下形式():
轮数 | 长度 | ||||||||
---|---|---|---|---|---|---|---|---|---|
1 | 1 | ||||||||
2 | 2 | ||||||||
3 | 4 | ||||||||
4 | 8 |
容易写出以下代码,
inline void FWT_OR(int *A) {
for (int len = 2; len <= (1 << n); len *= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i)
A[i + len / 2] = (A[i] + A[i + len / 2]) % mod;
}
对于 变换为 ,反着把 数组转化为 数组即可。
inline void IFWT_OR(int *A) {
for (int len = (1 << n); len >= 2; len /= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i)
A[i + len / 2] = (A[i + len / 2] - A[i]) % mod;
}
和 的变换同上。
inline void FWT_AND(int *A) {
for (int len = 2; len <= (1 << n); len *= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i)
A[i] = (A[i] + A[i + len / 2]) % mod;
}
inline void IFWT_AND(int *A) {
for (int len = (1 << n); len >= 2; len /= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i)
A[i] = (A[i] - A[i + len / 2]) % mod;
}
这个比较难。
以下摘自 oi-wiki。
若我们令 表示 中 1 数量的奇偶性,即 ,那么容易有 。
下证上式():
只考虑 的二进制中为 1 的位, 中 1 的数量 和 中 1 的数量可以分成三个部分:
1、都有的数量
2、仅有 有的数量
3、仅有 有的数量
即证明:
显然,当 时上式成立,,, 增加 1 并不会改变上述等式。
,证明如下:
inline void FWT_XOR(int *A) {
for (int len = 2; len <= (1 << n); len *= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i) {
A[i] = (A[i] + A[i + len / 2]) % mod;
A[i + len / 2] = (A[i] - 2 * A[i + len / 2]) % mod;
}
}
inline void IFWT_XOR(int *A) {
for (int len = (1 << n); len >= 2; len /= 2)
for (int x = 0; x < (1 << n); x += len)
for (int i = x; i < x + len / 2; ++ i) {
A[i + len / 2] = 1ll * (A[i] - A[i + len / 2])
* quick_pow(2, mod - 2) % mod;
A[i] = (A[i] - A[i + len / 2]) % mod;
}
}
同或
若我们令 表示 中 1 数量的奇偶性,即 。
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧