FWT学习笔记
FWT学习笔记
引入
一般的多项式乘法是这样子的:
\(c_i=\sum_{i,j}a_j*b_k*[j+k==i]\)
但是如果我们将这个乘法式子里面的+号变换一下变成其他的运算符号呢?
\(c_i=\sum_{i,j}a_j*b_k*[j\oplus k==i]\)
其中\(\oplus\)可以取\(and,or,xor\)
这个时候FFT和NTT就没有什么用了...
前人的智慧是无穷的!
考虑一个神奇的算法:FWT(快速沃尔什变化)
or卷积
先从最容易的or卷积下手.
我们考虑他给出的式子:
\(c_i=\sum_{i,j}a_j*b_k*[i|j==k]\)
我们将i,j按照二进制拆开,发现这其实相当于是一个状压dp?
然后就可以直接搞了(因为这个二进制有传递的效果.)
上面是废话...
考虑怎么求这个玩意:
用一个式子:
\(FWT(A)=\begin{cases}(FWT(A_0),FWT(A_0+A_1)) & n\gt0 \\ A & n=0\end{cases}\)
这个证明不会(真的菜)
然后只要把这个套进去就可以了(或还是比较简单)
然后就好了啊.qwq
and卷积
这个东西的话其实和or没有什么比较大的区别:
\(FWT(A)=\begin{cases}(FWT(A_0+A_1),FWT(A_1)) & n\gt0 \\ A & n=0\end{cases}\)
xor卷积
\(FWT(A)=\begin{cases}(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1)) & n>0\\A & n=0\end{cases}\)
证明的坑以后会补的.
IFWT
考虑FFT我们怎么做的?
肯定是先把\(FFT(C)=FFT(A)*FFT(B)\)(这个是逐位乘)
然后再还原对吧.
所以FWT也需要还原.
然后既然怎么来的推出来了,怎么回去也就会了不是吗?
代码实现
namespace cpp1{
int A[N],B[N],limit;
void init(){
limit=len;
for(int i=0;i<limit;i++)A[i]=a[i];
for(int i=0;i<limit;i++)B[i]=b[i];
}
void FMT(int *A,int limit,int opt){
for(int i=1;i<limit;i<<=1)
for(int j=0;j<limit;j++)
if(i&j)
if(opt==1)A[j]=(A[j]+A[j^i])%Mod;
else A[j]=(A[j]+Mod-A[j^i])%Mod;
}
void solve(){
FMT(A,limit,1);FMT(B,limit,1);
for(int i=0;i<limit;i++)A[i]=(1ll*A[i]*B[i])%Mod;
FMT(A,limit,-1);
for(int i=0;i<limit;i++)printf("%d%c",A[i],i==limit-1?'\n':' ');
}
}
namespace cpp2{
int A[N],B[N],limit;
void init(){
limit=len;
for(int i=0;i<limit;i++)A[i]=a[i];
for(int i=0;i<limit;i++)B[i]=b[i];
}
void FWTand(int *a,int limit,int opt){
for(int i=1;i<limit;i<<=1)
for(int j=0,p=i<<1;j<limit;j+=p)
for(int k=0;k<i;k++)
if(opt==1)a[j+k]=(a[j+k]+a[i+j+k])%Mod;
else a[j+k]=(a[j+k]-a[i+j+k]+Mod)%Mod;
}
void solve(){
FWTand(A,limit,1);FWTand(B,limit,1);
for(int i=0;i<limit;i++)A[i]=(1ll*A[i]*B[i])%Mod;
FWTand(A,limit,-1);
for(int i=0;i<limit;i++)printf("%d%c",A[i],i==limit-1?'\n':' ');
}
}
namespace cpp3{
int A[N],B[N],limit,inv2=499122177;
void init(){
limit=len;
for(int i=0;i<limit;i++)A[i]=a[i];
for(int i=0;i<limit;i++)B[i]=b[i];
}
void FWTxor(int *a,int limit,int opt){
for(int i=1;i<limit;i<<=1)
for(int p=i<<1,j=0;j<limit;j+=p)
for(int k=0;k<i;k++){
int X=a[j+k],Y=a[i+j+k];
a[j+k]=(X+Y)%Mod;a[i+j+k]=(X+Mod-Y)%Mod;
if(opt==-1){
a[j+k]=1ll*a[j+k]*inv2%Mod;
a[i+j+k]=1ll*a[i+j+k]*inv2%Mod;
}
}
}
void solve(){
FWTxor(A,limit,1);FWTxor(B,limit,1);
for(int i=0;i<limit;i++)A[i]=(1ll*A[i]*B[i])%Mod;
FWTxor(A,limit,-1);
for(int i=0;i<limit;i++)printf("%d%c",A[i],i==limit-1?'\n':' ');
}
}
FWT学习笔记的更多相关文章
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
- FWT 学习笔记
FWT学习笔记 好久以前写的,先粘上来 定义数组 \(n=2^k\) \(A=[a_0,a_1,a_2,a_3,...,a_{n-1}]\) 令\(A_0=[a_0,a_1,a_2,...,a_{\f ...
- FMT/FWT学习笔记
目录 FMT/FWT学习笔记 FMT 快速莫比乌斯变换 OR卷积 AND卷积 快速沃尔什变换(FWT/XOR卷积) FMT/FWT学习笔记 FMT/FWT是算法竞赛中求or/and/xor卷积的算法, ...
- $\text {FWT}$学习笔记
\(\text {FWT}\) 学习笔记 正常项的\(\text {FWT}\) 在\(\text {OI}\)中,我们经常会碰到这种问题: 给出一个长度为\(n\)的序列\(a_{1,2,...,n ...
- 快速沃尔什变换 (FWT)学习笔记
证明均来自xht37 的洛谷博客 作用 在 \(OI\) 中,\(FWT\) 是用于解决对下标进行位运算卷积问题的方法. \(c_{i}=\sum_{i=j \oplus k} a_{j} b_{k} ...
- 快速沃尔什变换 FWT 学习笔记【多项式】
〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂 ...
- 快速沃尔什变换(FWT)学习笔记 + 洛谷P4717 [模板]
FWT求解的是一类问题:\( a[i] = \sum\limits_{j\bigoplus k=i}^{} b[j]*c[k] \) 其中,\( \bigoplus \) 可以是 or,and,xor ...
- 卷积理论 & 高维FWT学习笔记
之前做了那么多生成函数和多项式卷积的题目,结果今天才理解了优化卷积算法的实质. 首先我们以二进制FWT or作为最简单的例子入手. 我们发现正的FWT or变换就是求$\hat{a}_j=\sum_{ ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
随机推荐
- Zxing2.1扫描取景框变形问题解决
修改竖屏扫描的贴子,2.0之前的都很适用.可是到了2.1,有些贴子的做法可以将扫描框改为竖屏,但是取景框里扫描到的东西是变形的(扁的),本人仔细研究一番,终于解决了这个问题,下面贴出解决办法: 1.修 ...
- python上下文管理协议
所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with __enter__(self):当with开始运行的时候触发此方法的运行 __exit__(self, exc_type, exc_va ...
- Mac版Java安装与配置
一.下载并安装JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 双击下载的 ...
- 使用xtrabackup备份innodb引擎的数据库
innodb引擎的数据库可以使用mysqldump备份,如果表很大几十个G甚至上百G,显示用mysqldump备份会非常慢.然后使用xtrabackup 可以很快的在线备份innodb数据库.Inno ...
- C# 单例模式的五种写法
1.简单实现 C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public sealed c ...
- 再读c++primer plus 005
对象和类: 1.类和结构的唯一区别是结构的默认访问类型是public,而类为private: 2.其定义位于类声明中的函数都将自动成为内联函数,也可以在类声明外定义成员函数,并使其成为内联函数,为此只 ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- python:OS模块
r"""OS routines for NT or Posix depending on what system we're on. This exports: - al ...
- 开启笔记本win7的虚拟热点笔记本变成wifi
工具/原料 windows 7电脑一台 步骤/方法 1 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费 ...
- NodeList类型
NodeList近亲NameNodeMap.HTMLCollection是从整体上透彻理解DOM的关键所在.这三个集合都是'动态的' 换句话说,每当文档结构发生变化时,它们都会更新. 所以它们始终都会 ...