P4717 【模板】快速沃尔什变换
思路
FWT的模板
FWT解决这样的卷积
\]
\(\otimes\)可能是and,or,xor等位运算
几个式子
FWTand:
\]
IFWTand:
\]
FWTor:
\]
IFWTor:
\]
FWTxor:
y=a[k+len]\\
a[k]=x+y\\
a[k+len]=x-y
\]
IFWTxor:
y=a[k+len]\\
a[k]=\frac{x+y}{2}\\
a[k+len]=\frac{x-y}{2}
\]
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int inv2 ,a[140000],b[140000],c[140000],n;
const int MOD = 998244353;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
void FWTor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k+len]=(a[k+len]+a[k])%MOD;
}
}
void IFWTor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k+len]=(a[k+len]-a[k]+MOD)%MOD;
}
}
void FWTand(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k]=(a[k]+a[k+len])%MOD;
}
}
void IFWTand(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k]=(a[k]-a[k+len]+MOD)%MOD;
}
}
void FWTxor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=(x+y)%MOD;
a[k+len]=(x-y+MOD)%MOD;
}
}
}
void IFWTxor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=1LL*(x+y)%MOD*inv2%MOD;
a[k+len]=1LL*(x-y+MOD)%MOD*inv2%MOD;
}
}
}
int main(){
inv2 = pow(2,MOD-2);
scanf("%d",&n);
for(int i=0;i<(1<<n);i++)
scanf("%d",&a[i]);
for(int i=0;i<(1<<n);i++)
scanf("%d",&b[i]);
int midlen=1;
while(midlen<(1<<n))
midlen<<=1;
FWTor(a,midlen);
FWTor(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTor(a,midlen);
IFWTor(b,midlen);
IFWTor(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n");
FWTand(a,midlen);
FWTand(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTand(a,midlen);
IFWTand(b,midlen);
IFWTand(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n");
FWTxor(a,midlen);
FWTxor(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTxor(a,midlen);
IFWTxor(b,midlen);
IFWTxor(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n");
return 0;
}
P4717 【模板】快速沃尔什变换的更多相关文章
- 洛谷.4717.[模板]快速沃尔什变换(FWT)
题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...
- LG4717 【模板】快速沃尔什变换
题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输 ...
- 快速沃尔什变换(FWT)学习笔记
概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x) 即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...
- 初学FWT(快速沃尔什变换) 一点心得
FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi=j⊕k=i∑Aj∗Bk此处乘号为普通乘法 ...
- Fast Walsh-Hadamard Transform——快速沃尔什变换
模板题: 给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求 $$C_i = \sum_{j \oplus k = i} A_j B_k$$ 其中$\oplus$ ...
- [学习笔记]FWT——快速沃尔什变换
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...
- 快速沃尔什变换(FWT)笔记
开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
随机推荐
- scrapy_redis实现爬虫
1.scrapy_redis的流程 在scrapy_redis中,所有的带抓取的对象和去重的指纹都存在所有的服务器公用的redis中 所有的服务器公用一个redis中的request对象 所有的req ...
- IIS宿主WCF服务*.svc Mime类型映射
经常会遇到由于.net安装组件缺失,导致发布wcf服务后,访问wcf报.svc请求类型不支持 简单方法就是添加删除程序,修改.net组件安装选项,勾选http激活即可: 或者手工添加映射处理程序 1. ...
- SpringBoot 学习教程(二):示例
发布方式 构建Jar包,cmd命令行运行Spring Boot程序 第一步:在pom.xml中将packing节点值修改为jar,如下面加粗部分: <groupId>com.example ...
- ADB——模拟手机按键输入
基本命令 adb 模拟按键输入的命令主要通过 input 进行 Usage: input [<source>] <command> [<arg>...] The s ...
- Docker Machine批量安装docker host
Dokcer Machine Docker Machine 可以批量安装和配置 docker host 提高docker的安装效率 同时减少人工安装操作的失误 [root@localhost ...
- 数据库设计入门及ERMaster的安装和使用
数据库的设计步骤 1.标识表 (根据需求创建表) 2.标识表的字段 3.标识表与表之间的关系 注意事项: 三大范式: 1.确保标识的字段的原子性,字段的概念分的不能再分 2.确保字段与表有依赖的关系 ...
- 位运算符 & | ~ ^ << >>
# ### 位运算符 & | ~ ^ << >> var1 = 19 var2 = 15 # & 按位与 """ res = va ...
- 创建存储过程 in,out,inout
in: 输入参数,存储过程如果修改了参数值,那么不能被返回. out:输出参数,存储过程中修改了参数值,可以被返回.inout:输入参数,存储过程如果修改了参数值,可以被返回 注意参数格式: in ...
- 再次聊一聊promise settimeout asycn awiat执行顺序---js执行机制 EVENT LOOP
首先js是单线程 分为同步和异步,异步又分为(macrotask 宏任务 和 microtask微任务 ), 这图还是很清晰嘛,再来一张 总结一下,就是遇到同步先执行同步,异步的丢到一边依次排队,先排 ...
- cdh安装spark遇到的几个BUG
spark安装后启动: [zdwy@master spark]$ sbin/start-all.sh starting org.apache.spark.deploy.master.Master, l ...