\[C_k = \sum_{i|j=k}A_i B_j
\]

这样的或卷积可以做一次 \(\text{FWT}\),把数组变为 \(\widehat{A}_i = \sum_{j\subseteq i}A_i\),也就是子集和的形式,然后就可以对应位相乘了

变回去的话就减掉之前加上来的贡献

与卷积,异或卷积同理

如果异或卷积只要求某一特定的次数 \(i\) 的系数,那么有 \([x^i]\widehat{A} = \sum_j [x^j]A \cdot {(-1)}^{\text{popcount(i&j)}}\)

而逆回去的话照上面的式子只要再多乘个 \(\frac1{2^{len}}\) 即可

$\text{Code}$
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define IN inline
using namespace std; template <typename T>
IN void read(T &x) {
x = 0; char ch = getchar(); int f = 0;
for(; !isdigit(ch); f = (ch == '-' ? 1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f) x = ~x + 1;
} typedef long long LL;
const int N = 2e5 + 5, P = 998244353, inv2 = (P + 1) >> 1;
int A[N], B[N], a[N], b[N], n; IN void init(){for(int i = 0; i < n; i++) a[i] = A[i], b[i] = B[i];}
IN void print(){for(int i = 0; i < n; i++) printf("%d ", a[i]); puts("");}
IN void mul(){for(int i = 0; i < n; i++) a[i] = (LL)a[i] * b[i] % P;} IN void FWT_or(int *a, int op) {
for(int mid = 1; mid < n; mid <<= 1)
for(int i = 0; i < n; i += (mid << 1))
for(int j = 0; j < mid; ++j)
(a[i + j + mid] += (LL)a[i + j] * op % P) %= P;
}
IN void FWT_and(int *a, int op) {
for(int mid = 1; mid < n; mid <<= 1)
for(int i = 0; i < n; i += (mid << 1))
for(int j = 0; j < mid; ++j)
(a[i + j] += (LL)a[i + j + mid] * op % P) %= P;
}
IN void FWT_xor(int *a, int op) {
for(int mid = 1; mid < n; mid <<= 1)
for(int i = 0; i < n; i += (mid << 1))
for(int j = 0; j < mid; ++j) {
int x = a[i + j], y = a[i + j + mid];
a[i + j] = (LL)(x + y) * op % P,
a[i + j + mid] = (LL)(x - y + P) * op % P;
}
} int main() {
read(n), n = 1 << n;
for(int i = 0; i < n; ++i) read(A[i]);
for(int i = 0; i < n; ++i) read(B[i]);
init(), FWT_or(a, 1), FWT_or(b, 1), mul(), FWT_or(a, P - 1), print();
init(), FWT_and(a, 1), FWT_and(b, 1), mul(), FWT_and(a, P - 1), print();
init(), FWT_xor(a, 1), FWT_xor(b, 1), mul(), FWT_xor(a, inv2), print();
}

最新文章

  1. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(四)
  2. 分布式开放消息系统(RocketMQ)的原理与实践
  3. selenium设置Chrome
  4. 【Python自动化运维之路Day6】
  5. noip2014普及组 比例简化
  6. Android(java)学习笔记106-1:深入分析Java ClassLoader原理
  7. require backbone 移动
  8. JAVA bean与XML互转的利器---XStream
  9. DES加密系统的实现
  10. VS2012破解_序列号
  11. MVC运行机制
  12. linux通配符与正则表达式
  13. shell脚本基础1 概述及变量
  14. C# 动态调用WebService 3
  15. 3.docker基础架构
  16. Android逆向基础----Android Dalvik虚拟机
  17. linux源码安装服务器所需要的一些依赖库(待完善)
  18. C#集合类型大揭秘
  19. 启动与关闭WebService
  20. 使用copydata实现进程之间数据传递

热门文章

  1. 18V转5V,15V转5V的LDO和DC芯片方案
  2. UE4 WebUI插件使用指南
  3. 最大值减去最小值小于或等于 num 的子数组数量问题
  4. 手摸手,使用Dart语言开发后端应用,来吧!
  5. python运算符与基本数据类型
  6. json 提取器将提取的所有id拼接成字符串
  7. python Flask 操作数据库(2)
  8. python画社交网络图
  9. [seaborn] seaborn学习笔记9-绘图实例(1) Drawing example(1)
  10. .NET周报【1月第1期 2023-01-06】