\(\text {FWT}\) 学习笔记

正常项的\(\text {FWT}\)

在\(\text {OI}\)中,我们经常会碰到这种问题:

  • 给出一个长度为\(n\)的序列\(a_{1,2,...,n},b_{1,2,...,n}\),求出
\[c_k=\sum_{i\oplus j=k}a_i b_j
\]

其中\(\oplus\)是定义的一种二进制下的运算。

对于这种问题,我们有一种通用的方法,我们称之为\(\text {FWT}\)。

我们考虑对于一个\(A\)构造一个\(FWT\)变换序列,满足:

\[\forall A\times B=C,FWT[A]\star FWT[B]=FWT[C]
\]

其中\(\times\)就是上文定义的卷积,\(\star\)是按位乘法。

我们考虑定义一种二进制运算的函数\(c(i,j)\),满足:

\[FWT[A]_i=\sum_{j=0}^{n} c(i,j) A_j
\]

于是,我们可以得到:

若存在:

\[C=A\times B
\]

则有:

\[FWT[C]_i=\sum_{j=0}^{n} c(i,j)\sum_{k\oplus d=j} A_kB_d
\]
\[=\sum_{j=0}^{n} \sum_{k\oplus d=j} c(i,k\oplus d) A_k B_d
\]

而我们根据\(FWT\)的定义我们又可以得到:

\[FWT[C]_i=FWT[A]_i\times FWT[B]_i=(\sum_{j=0}^{n} c(i,j)A_j)\times (\sum_{j=0}^{n} c(i,j)B_j)
\]
\[=\sum_{j=0}^{n} \sum_{k=0}^{n} c(i,j) c(i,k)A_j B_k
\]

于是,我们就可以得到:

\[c(i,j)c(i,k)=c(i,j\oplus k)
\]

不过因为是在二进制下的运算,所以一般构造的话都会满足

\[i=(i_1i_2...i_n)_2
\]

则满足:

\[c(i,j)=c(i_1,j_1)c(i_2,j_2)...c(i_n,j_n)
\]

于是,我们只需要知道\(c(0/1,0/1)\)即可。

但是,我们现在仅仅可以在\(\Theta(n^2)\)的时间复杂度内求出和转换\(FWT[A]\),显然不能满足我们的对优秀的时间的渴求。

我们想一下在\(\text {FFT}\)中,我们是如何做到\(\Theta(n\log n)\)转换的?分治!!!我们在\(\text {FWT}\)中也可以用类似的方法。

我们考虑对于当前的\(FWT[A]_i\)应该如何求出。

可以得到:

\[FWT[A]_i=\sum_{j=0}^{n} c(i,j)A_j
\]
\[=\sum_{j=0}^{n/2-1} c(i_1,0) A_j+\sum_{j=n/2}^{n} c(i_1,1)A_j
\]
\[=c(i_1,0)FWT[A_0]_i+c(i_1,1)FWT[A_1]_i
\]

其中\(FWT[A_0/A_1]\)就是子集的一个变换,与\(\text {FFT}\)类似。

我们发现如果我们构造转移矩阵:

\[\text {mat}=\begin{bmatrix}c_{0,0} ,c_{0,1}\\ c_{1,0},c_{1,1} \end{bmatrix}
\]

其实\(A\to FWT[A]\)每一次变换就是乘上\(\text {mat}\),那么\(FWT[A]\to A\)就是乘上\(\text {mat}\)的逆矩阵。逆矩阵直接手动构造即可。

一些例子

\(\wedge\)

对于并卷积,我们可以构造\(c(i,j)=[i|j]\),其中\([i|j]\)表示的是二进制下的\(i\)是二进制下的\(j\)的子集(每一位\(0/1\)相当于该元素是否在当前集合出现)。

\(\vee\)

对于或卷积,我们可以构造\(c(i,j)=[j|i]\)。

\(\oplus\)

对于异或卷积,我们可以构造\(c(i,j)=(-1)^{|i\wedge j|}\)。

模板题

就是上面三种运算的总和,代码戳这里打开

非模板的一些例子

CF449D Jzzhu and Numbers

CF1119H Triple + 题解 link

\(\text {FST}\)

我们需要解决这样一个问题:

  • 给出一个长度为\(n\)的序列\(a_{1,2,...,n},b_{1,2,...,n}\),求出:
\[c_i=\sum_{j\vee k=i,j\wedge k=0} a_j b_k
\]

对于这个问题,如果没有\(j\wedge k=0\)的话,这就是一个板的\(\text {FWT}\) \(\vee\)运算。我们发现其实\(j\wedge k=0\)的条件就相当于\(|j|+|k|=|j\vee k|\),于是,我们可以设二维数组\(f_i\),我们可以设转移式:

\[f_i=\sum_{j=0}^{i} h_j w_{i-j}
\]

其中\(h_{i,j}=[|j|=i]a_j,w_{i,j}=[|j|=i]b_j\)。

很显然,最后的\(c_i=f_{|i|,i}\)。

于是,我们就可以在\(\Theta(n\log^ 2 n)\)的时间复杂度内解决这个问题。

代码戳这里打开

\(k\)进制下的\(\text {FWT}\)

我们发现上面的这个东西其实都是在\(2\)进制下面计算的,那么如果我们要拓展到\(k\)进制我们应该怎么办呢?

很显然,我们应该定义广义的\(\wedge,\vee,\oplus\)。

  • $\wedge $

在\(k\)进制下,定义\(a\wedge b=\min\{a,b\}\)

  • \(\vee\)

在\(k\)进制下,定义\(a\vee b=\max\{a,b\}\)

  • \(\oplus\)

在\(k\)进制下,定义\(a\oplus b=(a+b)\bmod k\)

因为\(\wedge,\vee\)不是很常用,所以这里着重介绍一下\(\oplus\)。

我们要考虑如何构造\(c(i,j)\),我们发现我们需要满足:

\[c(i,j)c(i,k)=c(i,(j+k)\bmod k)
\]

我们在脑中想一下,诶,似乎单位根满足这个条件诶!

于是,我们可以构造矩阵:

\[\begin{bmatrix}1&1&1&\cdots &1\\1&w_k^1&w_k^2&\cdots&w_k^{k-1}\\ 1&w_k^2&w_k^4&\cdots&w_k^{2(k-1)} \\ \vdots&\vdots& \vdots&\ddots &\vdots\\ 1&w_k^{k-1}&w_k^{2(k-1)}&\cdots&w_k^{(k-1)(k-1)}\end{bmatrix}
\]

而它的逆矩阵就是:

\[\frac{1}{k}\begin{bmatrix}1&1&1&\cdots &1\\1&w_k^{-1}&w_k^{-2}&\cdots&w_k^{-(k-1)}\\ 1&w_k^{-2}&w_k^{-4}&\cdots&w_k^{-2(k-1)} \\ \vdots&\vdots& \vdots&\ddots &\vdots\\ 1&w_k^{-(k-1)}&w_k^{-2(k-1)}&\cdots&w_k^{-(k-1)(k-1)}\end{bmatrix}
\]

一些例题

CF1103E Radix sum+题解 link

随机推荐

  1. Go测试--main测试

    目录 简介 示例 简介 子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down.但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这 ...

  2. git推送文件到gitee

    注册gitee账号 设置姓名.个人空间地址 点击头像旁边的加号,新建仓库 安装git # 设置姓名和邮箱,姓名是注册gitee时设置的姓名,邮箱是注册gitee的邮箱 git config --glo ...

  3. x和y为正整数变量,求满足 x+y | xy 的通解。

    x和y为正整数变量,求满足 x+y | xy 的通解. 解:由题设可知存在正整数t满足t(x+y)=xy. 设m=(x,y),则存在正整数u和v满足: x=mu, y=mv, (u,v)=1. 于是有 ...

  4. canal数据同步

    前面提到数据库缓存不一致的几种解决方案,但是在不同的场景下各有利弊,而今天我们使用的canal进行缓存与数据同步的方案是最好的,但是也有一个缺点,就是相对前面几种解决方案会引入阿里巴巴的canal组件 ...

  5. You-Get开源在线下载神器,搭配python更加丝滑(文中案例演示)

    大家好,我是辰哥 今天给大家介绍一个号称可以下载全网视频.音频.图像的开源库 --you-get you-get 这里说全网可能一点夸张,但如果实际上去使用you-get下载媒体文件(视频.音频.图像 ...

  6. 20210811 Dove 打扑克,Cicada 与排序,Cicada 拿衣服

    考场 开考感觉 T3 比较可做.T1 看上去不难但毫无思路. 先想了 25min T3,想到一个确定左端点,二分最长的右端点,甚至想到了用猫树维护区间 or and...上厕所回来发现假了,没有单调性 ...

  7. ubantu与CentOS虚拟机之间搭建GRE隧道

    Author       : Email         : vip_13031075266@163.com Date          : 2020.01.23 Copyright : 未经同意不得 ...

  8. MySQL高级语句(二)

    目录: 1.别名 2.子查询 3.EXISTS 4.连接查询 5.CREATE VIEW 视图 6.UNION 联集 7.交集值 8.无交集值 9.CASE 10.算排名 11.算中位数 12.算累积 ...

  9. Playfield 类方法的注释

    前言 本篇随笔的底包采用的是百度炉石兄弟吧20200109折腾版中自带的 routines 文件. 本次仅为绝大多数方法添加 xml 注释和简单解析,没有具体解析与重构. Playfield 类方法众 ...

  10. 343 day08File类、递归

    day08[File类.递归] 主要内容 File类 递归 教学目标 [ ] 能够说出File对象的创建方式 [ ] 能够说出File类获取名称的方法名称 [ ] 能够说出File类获取绝对路径的方法 ...