思路

FWT的模板

FWT解决这样的卷积

\[C_k=\sum_{i\otimes j=k} A_iB_j
\]

\(\otimes\)可能是and,or,xor等位运算

几个式子

FWTand:

\[a[k]+=a[k+len]
\]

IFWTand:

\[a[k]-=a[k+len]
\]

FWTor:

\[a[k+len]+=a[k]
\]

IFWTor:

\[a[k+len]-=a[k]
\]

FWTxor:

\[x=a[k]\\
y=a[k+len]\\
a[k]=x+y\\
a[k+len]=x-y
\]

IFWTxor:

\[x=a[k]\\
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 【模板】快速沃尔什变换的更多相关文章

  1. 洛谷.4717.[模板]快速沃尔什变换(FWT)

    题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...

  2. LG4717 【模板】快速沃尔什变换

    题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输 ...

  3. 快速沃尔什变换(FWT)学习笔记

    概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...

  4. 初学FWT(快速沃尔什变换) 一点心得

    FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法 ...

  5. 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$ ...

  6. [学习笔记]FWT——快速沃尔什变换

    解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...

  7. 快速沃尔什变换(FWT)笔记

    开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...

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

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

  9. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

  10. FWT快速沃尔什变换学习笔记

    FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...

随机推荐

  1. Linux netfilter 学习笔记

    https://blog.csdn.net/lickylin/article/details/33321905

  2. 第 1 章 JS变量、作用域

    目录 一. 判断变量类型 二.作用域 和 上下文 1. 作用链 2. 上下文(this) 二.JS的解析机制 1. 预解析 三.垃圾收集 内存管理销毁 @(es5) 基本类型 引用类型 一. 判断变量 ...

  3. Ajax原理以及优缺点

    ajax原理和XmlHttpRequest对象 Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其 ...

  4. ES6新特性-函数的简写(箭头函数)

    通常函数的定义方法 var fn = function(...){ ...... } //例如: var add = function(a,b){ return a+b; } //或者: functi ...

  5. JS 变量和函数提升 全局变量和局部变量

    变量提升 1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.l ...

  6. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  7. requests 可以玩接口自动化测试,爬虫也是可以滴

    import requests #1.带参的get请求: url ='URL_你的' requests.get(url,params={"key":"value" ...

  8. Windows 10,鼠标右键-发送到-桌面快捷方式缺失解决方法

    1-双击“我的电脑”. 进到这里 2-路径框修改为“shell:Sendto”,回车. 3-把“桌面快捷方式”黏贴到Sendto文件夹下

  9. Python语言——基础01-环境安装、注释、变量

    开篇导言: 今天开始进行python学习的笔记更新,以后我都用截图的方式更新,方便不麻烦,界面美观,今天学习更新的python学习内容是环境安装.注释.变量的内容 关注我博客的童鞋从现在开始也可以跟着 ...

  10. STM32F103单片机解密资料

    STM32F103单片机解密资料下载 一.STM32 32位ARM Cortex MCU 基于ARM® Cortex® M 处理器内核的 32位闪存微控制器STM32产品家族,为MCU用户开辟了一个全 ...