FWT小结

news2024/10/7 10:21:22

核心思想:把 a , b a,b a,b 化成 f w t ( a ) , f w t ( b ) fwt(a),fwt(b) fwt(a),fwt(b),相乘后再化为 a a a

化的过程用的是分治

所以和FFT其实一模一样

OR / AND 卷积

不需要什么技巧,暴力分治转移即可

每次分治下去,相当于位数减一

注意合并过程中我们是计算对应位的贡献

因为其它位的贡献我们在分治下去时已经计算了

后面区间其他数贡献到前面某个位置已经统计到后面的那个位置了
在这里插入图片描述

OR

在这里插入图片描述
在这里插入图片描述
考虑如何还原

对上面式子进行换元即可

在这里插入图片描述

void OR(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1)
		for(i=0; i<n; i+=o)
			for(j=0; j<k; ++j) 
				f[i+j+k]=(f[i+j+k]+f[i+j]*x)%mo; 
}

AND

反过来好像就行了

在这里插入图片描述

void AND(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1)
		for(i=0; i<n; i+=o)
			for(j=0; j<k; ++j) 
				f[i+j]=(f[i+j]+f[i+j+k]*x)%mo; 
}

XOR卷积

这个需要点技巧

首先考虑若有转移系数,必须满足以下条件:

在这里插入图片描述

我们可以用以下方法构造:

在这里插入图片描述

构造的原理:

异或前后 1 的个数的奇偶性不变

因此得证:

在这里插入图片描述

在这里插入图片描述

所以有:

在这里插入图片描述

我们把它写成这个形式:

在这里插入图片描述

然后考虑如何FWT和IFWT

思考分治过程中popcount的变化

在这里插入图片描述

因此合并的过程可以表示为:

在这里插入图片描述

换元一下可以得到其逆变换:

在这里插入图片描述

void XOR(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1) 
		for(i=0; i<n; i+=o) 
			for(j=0; j<k; ++j) {
				f[i+j]+=f[i+j+k]; 
				f[i+j+k]=f[i+j]-2*f[i+j+k]; 
				f[i+j]=f[i+j]*x%mo; f[i+j+k]=f[i+j+k]*x%mo; 
			}
}

板子

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//#define M
#define mo 998244353
#define N 200010
int pw(int a, int b) {
	int ans=1; 
	while(b) {
		if(b&1) ans*=a; 
		a*=a; b>>=1; 
		ans%=mo; a%=mo; 
	}
	return ans; 
}
const int inv2=pw(2, mo-2); 
int n, m, i, j, k, T;
int a[N], b[N], A[N], B[N], o; 

void cp() {
	for(i=0; i<n; ++i) a[i]=A[i], b[i]=B[i]; 
}

void pr() {
	for(i=0; i<n; ++i) printf("%lld ", (a[i]%mo+mo)%mo); 
	printf("\n"); 
}

void mul() {
	for(i=0; i<n; ++i) a[i]=a[i]*b[i]%mo; 
}

void OR(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1)
		for(i=0; i<n; i+=o)
			for(j=0; j<k; ++j) 
				f[i+j+k]=(f[i+j+k]+f[i+j]*x)%mo; 
}

void AND(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1)
		for(i=0; i<n; i+=o)
			for(j=0; j<k; ++j) 
				f[i+j]=(f[i+j]+f[i+j+k]*x)%mo; 
}

void XOR(int *f, int x) {
	for(k=1, o=2; o<=n; o<<=1, k<<=1) 
		for(i=0; i<n; i+=o) 
			for(j=0; j<k; ++j) {
				f[i+j]+=f[i+j+k]; 
				f[i+j+k]=f[i+j]-2*f[i+j+k]; 
				f[i+j]=f[i+j]*x%mo; f[i+j+k]=f[i+j+k]*x%mo; 
			}
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}
	n=read(); n=(1<<n); 
	for(i=0; i<n; ++i) A[i]=read(); 
	for(i=0; i<n; ++i) B[i]=read(); 
	cp(); OR(a, 1); OR(b, 1); mul(); OR(a, -1); pr(); 
	cp(); AND(a, 1); AND(b, 1); mul(); AND(a, -1); pr(); 
	cp(); XOR(a, 1); XOR(b, 1); mul(); XOR(a, inv2); pr(); 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)

瑞萨MCU零基础入门系列教程 前言 得益于瑞萨强大的MCU、强大的软件开发工具(e studio)&#xff0c;也得益于瑞萨和RA生态工作室提供的支持&#xff0c;我们团队编写了《ARM嵌入式系统中面向对象的模块编程方法》&#xff0c;全书37章&#xff0c;将近500页: 讲解面向对象编程…

硬件笔记:组装“固态 U 盘”的八年,从 100 块到 1000 块

这篇文章&#xff0c;聊聊自从 2015 年开始&#xff0c;到目前为止&#xff0c;我使用固态硬盘组装的高速 U 盘&#xff0c;以及它们的使用体验&#xff0c;以及一些明显的坑。 写在前面 2015 年的 8 月&#xff0c;我剁手下单了一块 32G 大小&#xff0c;NGFF接口的三星 22x…

关于 C/C++ 中在指针前加 const 关键字的作用说明

1. 作用说明&#xff1a; 在指针前加 const 的用途为&#xff1a;不可改变指针指向的内存的值&#xff0c;即将该指向指向的内存中的变量置为只读&#xff08;read-only) 变量。 但是&#xff0c;可以给 const 的指针赋值&#xff0c;即将具有 const 属性的指针指向别的内存地…

Linux 内核镜像分析

文章目录 前言一、概述二、bzImage2.1 镜像分析 三、zImage3.1 镜像分析参考链接 前言 介绍了vmlinux的来源&#xff0c;以及分析方法&#xff1b; 一、概述 在linux系统中&#xff0c;vmlinux&#xff08;vmlinuz&#xff09;是一个包含linux kernel的静态链接的可执行文件…

JavaScript中的原型继承和类继承之间的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 原型继承&#xff08;Prototype Inheritance&#xff09;⭐ 类继承&#xff08;Class Inheritance&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启…

MySQL开启安全审计日志,开启查询日志

MySQL 查询开启日志 在 MySQL 数据库中&#xff0c;开启查询日志是一个非常有用的技术&#xff0c;它能帮助你追踪每一个执行的查询语句&#xff0c;以便更好地优化 SQL 语句和性能。本文将介绍如何在 MySQL 数据库中开启查询日志。 开启查询日志 MySQL 中的查询日志是一种记…

Mysql开启binlog

本案例基于mysql5.7.16实验 1、在linux中进入mysql查询binlog是否打开&#xff0c;执行命令如下&#xff1a; mysql -u root -p 2、查询binlog是否开启命令如下&#xff0c;如果log_bin为OFF则证明mysql的binlog没有打开 show variables like %log_bin%; 3、退出mysql终端&…

OPC DA如何实现跨平台

目录 简介 EntireX DCOM Utgard OPC XML DA OPC UA 协议转换代理 简介 本文介绍OPC DA跨平台通讯的几种方案。 OPC官方说明文档 OPC&#xff08;OLE for Process Control&#xff09;是为过程控制专门设计的OLE 技术&#xff0c;基于COM/DCOM的数据访问的标准。常说的O…

vmware去虚拟化

路径&#xff1a;C:\Program Files (x86)\VMware\VMware Workstation\x64\vmware-vmx.exe &#xff0c;复制一份备份 用16进制工具打开修改这个文件&#xff0c;如winhex 1、搜索 25 73 2E 65 6E 61 62 6C &#xff0c;找到上面有两个"VMware"开头的 2、硬盘SCSI格…

JAVASE---String类

String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想&#xff0c;而…

Java 类和对象

在面向对象语言中万物皆对象&#xff0c;一切都围绕对象来进行&#xff0c;找对象、建对象&#xff0c;用对象等。 类&#xff1a;把具有相同特征和行为的一组对象抽象为类&#xff0c;类是抽象概念&#xff0c;如人类、车类等&#xff0c;无法具体到每个实体。 对象&#xff…

71、Spring Data JPA 的 样本查询--参数作为样本去查询数据库的数据,也可以定义查询的匹配规则

★ 样本查询 给Spring Data传入一个样本数据&#xff0c;Spring Data就能从数据库中查询出和样本相同的数据。被查询的数据并不需要和样本是完全相同的&#xff0c;可能只需要和样本有几个属性是相同的。总结&#xff1a; 样本查询–就是把参数作为样本去查询数据库的数据&…

一、 计算机网络概论

一、计算机网络概论 1、计算机网络概述 1.1、概念 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统 是一些互连的、自治的计算机系统的集合 以能够相互共享资源的方…

【Git】Git 变基(rebase)以及rebase和merge之间的区别

Git 变基 1.变基 — rebase 在 Git 中整合来自不同分支的修改主要有两种方法&#xff1a;merge 以及 rebase。 在前面的文章中已经介绍了merge&#xff0c;这里我们来学习另一个指令rebase。 变基的基本操作 回顾之前在 分支的合并 中的一个例子&#xff0c;在该例子中&am…

go Gorm连接数据库,并实现增删改查操作

Gorm 1. 准备工作 首先进入终端下载我们需要的包&#xff08;确保go和mysql安装完成&#xff0c;并设置了环境变量&#xff09; go get -u gorm.io/driver/mysql go get -u gorm.io/gorm有两份官方文档有对 GORM 更详细的讲解。 创建 | GORM - The fantastic ORM library f…

EndNote21 | 账户同步问题

问题&#xff1a;无法同步&#xff0c;提示如下图所示。 原因&#xff1a;网络问题。 解决方法&#xff1a;国内网络无法实现同步&#xff0c;解决上网问题即可。

【数据结构】结构实现:顺序存储模式实现堆的相关操作

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章着重讲解了使用顺序结构实现堆的插入和删除等操作。 目录&#xff1a; &#x1f30d;二叉树的顺序结构&#x…

什么触控笔好用又便宜?ipad2022手写笔推荐

随着无纸化的广泛使用&#xff0c;和Apple pencil的出现&#xff0c;电容笔逐渐成为生产力的主要部分&#xff0c;像中性笔一样的电容笔&#xff0c;它不止具有小巧的身材&#xff0c;续航和功能都很在线&#xff0c;无论是在学习上还是工作上&#xff0c;电容笔逐渐成为人们缺…

Jenkis 配置钉钉通知

1、安装插件Ding Talk 2、钉钉上的配置 打开钉钉创建机器人&#xff0c;勾选加签&#xff0c;后面jenkins要用到 2.1 webhook -jenins界面要配置的地址&#xff1a;https://。。。。。。 2.2 jenkins 界面的加密地址 3、jenkins界面上的配置 在系统管理中找到安装好的插件&a…

部署docker image到AWS

1. 在AWS里创建ECR 仓库 2. 进入自己的Repository. 然后点击View push commands 3. 记一下这些命令 4. 登陆AWS cloud9 , 利用git clone 你的代码 5. 依次执行步骤3里的所有命令。最后你发现你的ECR里有了一个docker镜像 aws ecr-public get-login-password --region us-eas…