考虑变换 $$\hat{A_x} = \sum_{i\ or\ x = x}{ A_i }$$ 记 $S_{t}(A,x) = \sum_{c(i,t)\ or\ c(x,t)=c(x,t),\ i \le |A|}{A_i}$则 $\hat{A} = S_{\lceil log_2n \rceil}$ 初始情况下有 $S_0$ 被拆分为 $n$ 段, $S_0([A_i],i) = A_i$考虑每次将相邻两段合并. 记 $B0 = S_t([A0,A1],x)$ 的前一半,记 $B1$ 为后一…
模板题: 给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求 $$C_i = \sum_{j \oplus k = i} A_j B_k$$ 其中$\oplus$是某一满足交换律的位运算,要求复杂度$O(nlogn)$. 快速沃尔什变换: 这是什么东西?有用吗?请参阅SDOI2017r2d1-cut. 看到这个大家是不是立刻想到了快速傅里叶变换? $$C_i = \sum_{j + k = i} A_j B_k$$ 我们来想想离散傅里叶变换的本质. $$\b…
上次的博客有点模糊的说...我把思路和算法实现说一说吧... 思路 关于快速沃尔什变换,为了方便起见,我们采用线性变换(非线性变换不会搞). 那么,就会有一个变化前各数值在变换后各处的系数,即前一篇博文中的$f(i,j)$,表示线性变换中第$i$项到第$j$项的系数. 即 $$DWT(A)_i = \sum_{j=0}^{n-1} A_j * f(i,j)$$ 那么,我们既然要求$\oplus$卷积在变换后等价于乘积,就有 $$DWT(A)_i * DWT(B)_i = DWT(C)_i$$ 其…
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集合运算符. 就像FFT一样,FWT是对数组的一种变换,我们称数组X的变换为FWT(X). 所以FWT的核心思想是: 为了求得C=A★B,我们瞎搞搞出一个变换FWT(X), 使得FWT(C)=FWT(A)  FWT(B),然后根据FWT(C)求得C. (其中★表示卷积运算,表示将数组对应下标的数相乘的…
FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到底是什么 你们怎么念FWT的反正我念扶卧塔 \(FFT\)当然可以做多项式卷积 形如\(C(k)=\sum_{i+j=k}f[i]g[j]\),很简单,大家都会 由于有这个性质所以也可做分治\(FFT\) 但是如果把\(i+j\)换一下操作符 变成\(C(k)=\sum_{i???j=k}f[i]g…
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智商 ,网上的FWT博客我大多看不懂,下面这篇博客是留给我我再次忘记FWT时看的,所以像我一样的没智商选手应该也能看懂!有智商选手更能看懂咯! (写得非常匆忙,如有任何错误请在评论区指正!TAT) 什么是FWT FWT是用来快速做位运算卷积的.位运算卷积是什么?给出两个数组\(A\)和\(B\)(长度相等且是2…
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\sum_{i*j=k}A_i*B_j\)也能做(SDOI2015 序列统计). 但是,如果我们把操作符换一下呢? 比如这样? \(C_k=\sum_{i|j=k}A_i*B_j\) \(C_k=\sum_{i\&j=k}A_i*B_j\) \(C_k=\sum_{i\wedge j=k}A_i*B_…
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先转化成为另一个多项式$FWT(A),FWT(B)$ 使得:$FWT(A\oplus B)=FWT(A)×FWT(B)$ 这里,$×$是按位乘.这个是$O(n)$的. 然后,再$IFWT$回去即可. 类似于,直接过马路不好走.先从左边走上一座天桥,再从天桥走过去,再到马路右侧走下天桥. 就变成了$O(…
题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输入格式: 第一行一个数n. 第二行\(2^n\)个数\(A_0..A_{2^n-1}\)第三行\(2^n\)个数\(B_0..B_{2^n-1}\) ​ 输出格式: 三行每行\(2^n\)个数,分别代表\(\oplus\)是or,and,xor时\(C_0..C_{2^n-1}\)的值\(\bmod…
〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂级数的性质与应用及其快速算法 by 吕凯风 一.FWT 是什么 FWT 是快速沃尔什变换.它和快速傅里叶变换一样,原本都用于物理中的频谱分析. 但是由于它可分治的特点,在算法竞赛中常被用来计算位运算卷积. 二.FWT 能干什么 它可以在 \(O(n\log n)\) 的时间复杂度内由数组 \(a,b…
快速沃尔什变换\(FWT\) 是一种可以快速完成集合卷积的算法. 什么是集合卷积啊? 集合卷积就是在集合运算下的卷积.比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\),而集合卷积计算的就是\(C_i=\sum_{j\otimes k=i}A_j*B_k\),其中\(\otimes\)是一种集合运算,可以是与.或.异或. 类似于快速傅里叶变换\(FFT\),\(FWT\)也需要寻求一种变换方式\(FWT(A)\),使\(FWT(C)=FWT(A)*FWT(B)\)…
感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/article/details/52819835 里的快速沃尔什变换 这里说一下自己的理解吧,快速傅里叶变换是计算卷积的,就是∑f(x)*g(n-x)这种 快速沃尔什变换也是计算∑f(x)*g(y) ,但这里是计算所有的满足x^y = n(卷积是计算x+y=n)的和 当然,异或也可以换成&,|这些运算符…
概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^{'}[i]*b^{'}[i] \). 只要知道 c'[ i ] 和 c[ i ] 的关系,就能把 A(x).B(x) 变成 A'(x).B'(x) ,从而算出 C'(x) ,再把 C'(x) 变成 C(x). 或卷积 定义\( c^{'}[i]=\sum\limits_{j | i=i} c[j]…
其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_j\) \(C_k=\sum\limits_{i\land j=k}A_i*B_j\) \(C_k=\sum\limits_{i\oplus j=k}A_i*B_j\) 然后普通的FFT肯定应付不了这玩意,于是就有了FWT(快速沃尔什变换),然后我就直接写结论好了-- FWT--Or卷积 我们把多项…
开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C(x)$满足$C[i]=\sum\limits_{j⊗k=i}A[j]*B[k]$. 约定记号 $⊗$表示某种位运算(and,or和xor中的一种),若$a$,$b$是两个整数,则$a⊗b$表示对这两个数按位进行位运算:若$A$,$B$是两个多项式,则$A⊗B$表示对这两个多项式做如上卷积:两个多项式…
FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法,⊕⊕⊕表示一种位运算,如 与 and(&).and(\&).and(&).或 or(∣).or(|).or(∣).异或 xor(xor(xor(^))) LaTeX\Large\LaTeXLATE​X打不了 ^ 啊-qwq FWT思想 首先因为是位运算,所以需要按位分解.又因为是卷积…
也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级数也是形式幂级数的一种,只是集合的一种表现形式,无需考虑收敛或发散的含义 定义一个集合 \(S\) 的集合幂级数为 \(f\) ,那么我们就可以把集合 \(S\) 表示为如下形式 \(\begin{aligned}f=\sum _{T\subseteq S}f_{T}\cdot x^{T}\end{align…
[学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中\(*\)是点积,就是对应位置乘起来. 而对于\(orFWT\), \[ C'[i]=FWT(C)[i]=\sum_{j\subseteq i}C[j] \] 那么证明一下: \[ \begin{array} &C'[i]&=\sum_{j\subseteq i} C[j] \\ &=…
u1s1 距离省选只剩 5 days 了,现在学新算法真的合适吗(( 位运算卷积 众所周知,对于最普通的卷积 \(c_i=\sum\limits_{j+k=i}a_jb_k\),\(a_jb_k\) 的贡献累加到 \(c_{j+k}\) 上,因此这种卷积又被称为加法卷积. 但是对于某些卷积,\(a_jb_k\) 的贡献就不是累加到 \(j+k\) 上了,有一类卷积,\(a_jb_k\) 的贡献会累加到 \(j\otimes k\) 上,其中 \(\otimes\) 是某种位运算,即 \(\&,|…
知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j \oplus k = i} g[ j ] * h[ k ] $ 的形式的式子. 正常计算是 $ n^{ 2 } $ . 与运算卷积 众所周知有 $ ( i \& j ) == k \longleftrightarrow ( i \& k == k ) \& \& ( j \&…
问题: 已知$A=a_{0..n-1}$, $B=b_{0..n-1}$, 求$C=c_{0..2n-2}$,使: $$c_i = \sum_{j=0}^ia_jb_{i-j}$$ 定义$C$是$A$,$B$的卷积,记作 $$C = A * B$$ 例如多项式乘法等. 朴素做法是按照定义枚举$i$和$j$,但这样时间复杂度是$O(n^2)$. 能不能使时间复杂度降下来呢? 点值表示法: 我们把$A$,$B$,$C$看作多项式. 即: $$A(x) = \sum_{i=0}^{n-1}a_ix^i…
实在是 美丽的数学啊 关于傅里叶变换的博客 讲的很细致 图片非常易于理解http://blog.jobbole.com/70549/ 大概能明白傅里叶变换是干吗的了 但是还是不能明白为什么用傅里叶变换来算多项式求和 在多项式中,DFT就是系数表式转换成点值表示的过程. 我们熟知的是多项式的系数表示法,通过给定一组  来确定一个唯一的多项式: 而多项式还可以有另一种表示法,称为点值表示法: 其中 可以证明,对一组互不相同的该方法也可以唯一地表示一个多项式. 为什么要引入点值表示法这个并不"直观&q…
在多项式卷积的处理中,我们实际上实现的是下面的一个式子 \[ C_k=\sum_{i+j=k}A_iB_j \] 然而事实上有些和(sang)蔼(xin)可(bing)亲(kuang)的出题人,并不会让你直接求这样的式子,比如把+换成-什么的 但是更多时候,你拿到手上的却是这样一个式子 \[ C_k=\sum_{i\bigoplus j=k}A_iB_j \] 其中\(\bigoplus\)可能是\(or,and,xor\)中的一种或多种 那么现在我们就会使用FWT(快速沃尔什变化)来优化时间复…
CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都有一个颜色,共有 $ k(k\leq10) $ 种颜色,问有多少条路径可以遍历到所有 $ k $ 种颜色?(一条路径交换起点终点就算两条哦) 做法 事实证明,连我都能不看题解想出来的题果然都是水题qwq 我是从CJ的xzyxzy大佬上的博客上看到这道题的,所以就理所当然用FWT做了...然后才发现网…
One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learning something about matrix, so he decided to make a crazy problem for her. Bob has a six-faced dice which has numbers 0, 1, 2, 3, 4 and 5 on each face.…
这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ 组数据,现在问如果 $n$ 堆石子,每堆石子个数都是不超过 $m$ 的素数,有多少种不同的石子序列使得先手没有必胜策略,答案对 $10^9+7$ 取模.(石子堆顺序不同也算不同) $1\leq T\leq 80,1\leq n\leq 10^9,1\leq m\leq 5\times 10^4$.…
这是一篇用来卖萌的文章QAQ 考虑以下三类卷积 \(C_k = \sum \limits_{i \;or\;j = k} A_i * B_j\) \(C_k = \sum \limits_{i\;and\;j = k} A_i * B_j\) \(C_k = \sum \limits_{i\;xor\;j = k}A_i * B_j\) 由于前两种可以用FMT(高维前缀和)解决,那我们就谈谈第三种吧 下文中的\(n\)都是形如\(2^i - 1\)的数 下标的开与闭是根据好不好写来定的,但是还是…
定义 FWT是一种快速完成集合卷积运算的算法. 它可以用于求解类似 $C[i]=\sum\limits_{j⊗k=i}A[j]*B[k]$ 的问题. 其中⊗代表位运算中的|,&,^的其中一种. 求解(正变换) 设F(A)是对于A的一种变换. 并且F(A)要求满足:  $F(A)*F(B)=F(A⊗B)$ ①  $k*F(A)=F(k*A)$   ②   $F(A+B)=F(A)+F(B)$  ③ (A,B长度相同) 鉴于FWT和FFT长得特别像(而且求解的问题也比较类似),我们可以借鉴一下FFT…
题意: 给出一个\(n \times k\)的矩阵\(A\)和一个\(k \times n\)的矩阵\(B\),其中\(4 \leq N \leq 1000, \, 2 \leq K \leq 6\). 矩阵\(C=A \cdot B\),求矩阵\(C^{N^2}\)的各个元素之和,以上矩阵运算均是在模\(6\)的情况下计算的. 分析: 如果我们直接计算\(A \cdot B\)的话,这个矩阵非常大,不可能进行快速幂计算. 所以要变形一下, \((A \cdot B)^{N^2}=A \cdot…
FWT求解的是一类问题:\( a[i] = \sum\limits_{j\bigoplus k=i}^{} b[j]*c[k] \) 其中,\( \bigoplus \) 可以是 or,and,xor 三种问题的解决思路都是对多项式 \( a \) 构造一个 \( a' \),令 \( a' = b' * c' \): 那么只需要把 \( b \) 变换成 \( b' \),\( c \) 变换成 \( c' \),然后乘出 \( a' \),再逆变换得到 \( a \): 下面问题就变成如何快…