快速沃尔什变换(FWT) 学习笔记
来源:互联网 发布:java调用javascript 编辑:程序博客网 时间:2024/06/08 09:28
最近在做多校联赛的题目,发现有一道题需要用到FWT,于是我就去学了一下。膜拜一下大神,本篇博客仅对这篇博客进行一些细节上的补充。
FWT要解决的问题是
其中
如果直接暴力枚举i和j,我们需要
它的思路有点类似于FFT,它们都是通过先做一个变换,然后直接相乘,最后逆变换得到的,而变换和逆变换的过程都是用折半、分治来完成。
以做xor的过程为例
这里用
设A,B为一个
设C=A
设
其中上面的*表示两个向量对应为相乘。
前人已经试出来了
当k=0是,
当k>0时,
其中
下面我们就来证明当tf是上面的那个定义的时候,满足
首先我们需要先证明一个引理
当k=0时
当k>0时
其中
原式
接下来我们还要证明
当k=0时,
当k>0时,
暴力拆开括号
因为
所以
所以原式
因为异或每个位都是独立的,而我们根据最高位是0还是1,把A和B都拆成了两部分。
所以
这里表示着当
所以
下面给出三种运算的
xor
and
or
下面是代码
void FWT(int a[],int n) { for(int d=1;d<n;d<<=1) for(int m=d<<1,i=0;i<n;i+=m) for(int j=0;j<d;j++) { int x=a[i+j],y=a[i+j+d]; a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod; //xor:a[i+j]=x+y,a[i+j+d]=(x-y+mod)%mod; //and:a[i+j]=x+y; //or:a[i+j+d]=x+y; } } void UFWT(int a[],int n) { for(int d=1;d<n;d<<=1) for(int m=d<<1,i=0;i<n;i+=m) for(int j=0;j<d;j++) { int x=a[i+j],y=a[i+j+d]; a[i+j]=1LL*(x+y)*rev%mod,a[i+j+d]=(1LL*(x-y)*rev%mod+mod)%mod; //rev表示2在模mod下的逆元 //xor:a[i+j]=(x+y)/2,a[i+j+d]=(x-y)/2; //and:a[i+j]=x-y; //or:a[i+j+d]=y-x; } } void solve(int a[],int b[],int n) { FWT(a,n); FWT(b,n); for(int i=0;i<n;i++) a[i]=1LL*a[i]*b[i]%mod; UFWT(a,n); }
- [FWT] 快速沃尔什变换学习笔记
- 快速沃尔什变换(FWT) 学习笔记
- 快速沃尔什变换FWT
- FWT——快速沃尔什变换
- 快速沃尔什变换详解(FWT)
- 文章标题 FWT (快速沃尔什变换) 模板
- Codeforces 662C Binary Table 快速沃尔什变换(FWT)
- Codeforces 662C Binary Table FWT 快速沃尔什变换
- 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
- CSU 1911 Card Game 快速沃尔什变换(FWT)模板题
- 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
- FWT——学习笔记
- FWT 笔记
- 快速沃尔什变化(FWT)介绍
- 快速沃尔什变换学习小记
- GSL 学习笔记(快速傅立叶变换)
- [NTT] 快速数论变换学习笔记
- Apache Commons Math3学习笔记(1)- 快速傅立叶变换
- HTTP系列之HTTP扩展
- Linux 部署脚本(02)
- 【数据结构基础】归并排序
- 线程方式的trigger任务
- POI常用接口介绍
- 快速沃尔什变换(FWT) 学习笔记
- BeanFactory 和ApplicationContext(Bean工厂和应用上下文)
- 看脸的世界:牙齿整齐找工作更容易
- 八月份前端面试经验
- 【Maven】配置私有仓库
- 基于MQTT协议的 org.eclipse.paho.client.mqttv3 源码学习(一)
- JAVA线程安全相关数据结构使用建议
- java动态代理
- MS08-067漏洞复现