\[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();
}

LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)的更多相关文章

  1. P4717-[模板]快速莫比乌斯/沃尔什变换(FMT/FWT)

    正题 题目链接:https://www.luogu.com.cn/problem/P4717 题目大意 给出两个长度为\(2^n\)的数列\(A,B\)求 \[C_{n}=\sum_{i\ or\ j ...

  2. 集合并卷积的三种求法(分治乘法,快速莫比乌斯变换(FMT),快速沃尔什变换(FWT))

    也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级 ...

  3. 快速沃尔什变换(FWT) 与 快速莫比乌斯变换 与 快速沃尔什变换公式推导

    后面的图片将会告诉: 如何推出FWT的公式tf 如何推出FWT的逆公式utf 用的是设系数,求系数的方法! ============================================== ...

  4. 快速沃尔什变换&快速莫比乌斯变换小记

    u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) ...

  5. 快速莫比乌斯变换(FMT)

    快速莫比乌斯变换(FMT) 原文出处:虞大的博客.此仅作蒟蒻本人复习用~ 给定两个长度为n的序列 \(a_0, a_1, \cdots, a_{n-1}\)和\(b_0, b_1, \cdots, b ...

  6. FMT/FWT学习笔记

    目录 FMT/FWT学习笔记 FMT 快速莫比乌斯变换 OR卷积 AND卷积 快速沃尔什变换(FWT/XOR卷积) FMT/FWT学习笔记 FMT/FWT是算法竞赛中求or/and/xor卷积的算法, ...

  7. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  8. SpringBoot集成beetl模板快速入门

    SpringBoot集成beetl模板快速入门 首次探索 beetl官方网址:http://ibeetl.com/ 创建SpringBoot工程(idea) 新建工程 选择创建Spring工程 书写包 ...

  9. vue模板快速生成

    vue模板快速生成 vue 模板 快速生成  每一次都手动敲重复代码的话,是一个很繁琐的事情,通过vscode自带代码片段可以解决我们大部分问题 文件 => 首选项 => 用户代码片段=& ...

  10. 快速沃尔什变换(FWT)学习笔记 + 洛谷P4717 [模板]

    FWT求解的是一类问题:\( a[i] = \sum\limits_{j\bigoplus k=i}^{} b[j]*c[k] \) 其中,\( \bigoplus \) 可以是 or,and,xor ...

随机推荐

  1. 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化

    前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...

  2. 解决Linux使用deepin-wine跑qq,tim打不开文件所在文件夹

    前言 使用deepin-wine 跑qq,发现一个小bug 这里点击打开文件夹是没有效果的,包括在 tim 上也是这样 问题原因 出现这个问题是因为 deepin-wine 跑的 QQ,Tim 打开文 ...

  3. 数电第六周周结_by_yc

    时序逻辑电路的设计要点:   ①只有时钟信号和复位信号可以放在敏感列表里:   ②使用非阻塞赋值,即使用"<=";   ③无需对所有分支进行描述,对于未描述的分支,变量将保持 ...

  4. 【Java EE】Day09 JavaScript基础

    一.JavaScript简介 二.JavaScript语法 三.JavaScript对象

  5. ChatGPT 加图数据库 NebulaGraph 预测 2022 世界杯冠军球队

    一次利用 ChatGPT 给出数据抓取代码,借助 NebulaGraph 图数据库与图算法预测体坛赛事的尝试. 作者:古思为 蹭 ChatGPT 热度 最近因为世界杯正在进行,我受到这篇 Cambri ...

  6. LoadRunner11录制脚本

    1.打开LoadRunner11后界面如下: 2.点击"创建/编辑脚本",会打开一个新窗口,如下: 3.这里新建一个web/html格式的测试.点击"文件"-& ...

  7. 解决RockyLinux和Centos Stream 9中firefox无法播放HTML视频问题

    如题在测试两种centos后续系统时,发现firefox无法播放HTML视频问题.经过一番折腾找到了解决的办法,具体解决如下: 首先下载VLC $sudo yum install vlc 而后重启浏览 ...

  8. [OpenCV实战]30 使用OpenCV实现图像孔洞填充

    在本教程中,我们将学习如何填充二值图像中的孔.考虑下图左侧的图像.假设我们想要找到一个二值掩模,它将硬币与背景分开,如下图右侧图像所示.在本教程中,包含硬币的圆形区域也将被称为前景. 请注意,硬币的边 ...

  9. Spark通信框架RPC介绍

    Spark通信框架RPC介绍 内容安排: 1.RPC原理 2.nio操作 3.netty简单的api 4.自定义RPC框架 RPC原理学习 什么是RPC RPC(Remote Procedure Ca ...

  10. Spring Boot通过Actuator显示git和build的信息

    1 简介 为了更好的版本控制和问题定位,我们需要知道正在运行的应用是什么版本,什么时候打包的,Git的相关信息等.通过/actuator/info可以帮助我们获取这些信息. 2 配置 首先要有actu ...