首页 > 其他分享 >LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)

LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)

时间:2022-11-07 19:37:36浏览次数:38  
标签:LG ch int FMT mid P4717 FWT include void

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

这样的或卷积可以做一次 \(\text{FWT}\),把数组变为 \(a_i = \sum_{j\subseteq i}A_i\),也就是子集和的形式,然后就可以对应位相乘了
变回去的话就减掉之前加上来的贡献

与卷积,异或卷积同理

$\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,ch,int,FMT,mid,P4717,FWT,include,void
From: https://www.cnblogs.com/leiyuanze/p/16867128.html

相关文章

  • 记录因Sharding Jdbc批量操作引发的一次fullGC
    周五晚上告警群突然收到了一条告警消息,点开一看,应用fullGC了。于是赶紧联系运维下载堆内存快照,进行分析。内存分析使用MemoryAnalyzer打开堆文件mat下载地址:htt......
  • com.alibaba.excel.exception.ExcelGenerateException: Can not close IO
    线上出现一个导出excel的,报错:  第一想到的是数据量较大,查询超时,所以我把nginx超时时间设置长一点,还是不行。启动程序后,执行查询到了文件list,然后执行 EasyExcel.wr......
  • 【论文阅读】ICRA2021: VDB-EDT An Efficient Euclidean Distance Transform Algorith
    参考与前言Summary:浩哥推荐的一篇无人机下的建图andplanning实验Type:ICRAYear:2021论文链接:https://arxiv.org/abs/2105.04419youtubepresentationvideo:htt......
  • [Linear Algebra] 矩阵运算
    矩阵的加法与数乘对于两个大小相同的矩阵,我们定义加法:由对应元素相加得到的一个新矩阵。对于一个矩阵,我们定义数乘:每个元素都乘上一个常数\(c\)得到的一个新矩阵。容易验......
  • [Linear Algebra] 向量空间(待续……)
    对加法和数乘封闭的向量集合称为一个向量空间。狭义地来看,这里的“向量”都是\(\mathbb{R}^n\)空间中的。而广义地来看,只要我们对“元素”定义出“加法与数乘”,并且满足以......
  • [Linear Algebra] 行列式(待续……)
    三条基本性质两个向量可以描述平行四边形的面积,三个向量可以描述平行六面体的体积。再往高维推广,\(n\)个向量可以描述一个“\(n\)维平行多面体”的“体积”。我们将会看到......
  • LG2258 [NOIP2014 普及组] 子矩阵
    LG2258[NOIP2014普及组]子矩阵给出一个矩阵,求出一个子矩阵(对应在数列上的定义为子序列,从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵保持行与列的相对顺序......
  • LG4026 [SHOI2008]循环的债务 题解
    LG4026[SHOI2008]循环的债务给出三个整数\(x_1,x_2,x_3\)。\(x_1\)代表A欠B的钱数,\(x_2\)表示B欠C的钱数,\(x_3\)表示C欠A的钱数。接下来\(3\)行,每......
  • golang fmt.Ssanf详解
    Golangfmt.Sscanf()实例讲解时间:2022-04-07本文章向大家介绍Golangfmt.Sscanf()实例讲解,主要分析其语法、参数、返回值和注意事项,并结合实例形式分析了其使用技巧,希望通......
  • Linux fmt 命令
    Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与......