【学习笔记】FWT

主要是之前 FWT 就没学明白过,而且之前的博也咕了,所以补一篇。

FWT 主要用来计算一类位运算卷积的问题。假如我们有一个二元位运算 ,那么我们可以计算出:

ck=ij=kaibj

类似于 FFT 的思想,我们考虑构造一种线性变换 FWT,使得 FWT(a)FWT(b)=FWT(c)(点积)。

考虑找出 FWT 这个变换的转移系数(即矩阵表示)。我们设 FWT(a)=aF,其中 a 为横向量,F 为变换矩阵,那么就有 FWT(a)i=j=0n1ajFj,i

首先,我们知道 FWT(a)iFWT(b)i=FWT(c)i

FWT(a)iFWT(b)i=FWT(c)ij=0n1ajFj,ik=0n1bkFk,i=p=0n1cpFp,ij=0n1k=0n1ajbkFj,iFk,i=p=0n1cpFp,i

并且有:

cp=xy=paxbyp=0n1Fp,icp=p=0n1Fp,ixy=paxbyj=0n1k=0n1ajbkFj,iFk,i=p=0n1Fp,ixy=paxbyj=0n1k=0n1ajbkFj,iFk,i=x=0n1y=0n1axbyFxy,i

由此我们发现 Fj,iFk,i=Fjk,i

而位运算有一个重要的性质:每一位的运算是相互独立的。那么我们可以设 c(i,j) 表示单独一位 ij 的贡献,那么我们就可以设 Fi,j 等于 i,j 上的每一位的转移系数的乘积的和。

也就是说,我们想要 c(j,i)c(k,i)=c(jk,i)

那么,我们只需要根据这个位运算的计算值,列出若干形如 cjck=cjk 的方程,求出若干组解,组成一个矩阵即可。

同时,为了存在逆运算,我们必须保证矩阵可逆。

与卷积:

cici=cici{0,1}

c0c1=c0c1=1 or c0=0

[c0,c1]=[0,1] or [1,1]

那么 F=[1101],F1=[1101]。这个运算实际上代表着高维前缀和。

或卷积:

cici=cici{0,1}

c0c1=c1c0=1 or c1=0

[c0,c1]=[1,1] or [1,0]

那么 F=[1011],F1=[1011]。这个运算实际上代表着高维后缀和。

异或卷积:

c0c0=c0c0{0,1}

c0c1=c1c0=1 or c1=0

c1c1=c0c1{±1},c0=1

[c0,c1]=[1,1] or [1,1]

那么 F=[1111],F1=[12121212]

可以拓展到高维。

例如:ARC132F Takahashi The Strongest

4 进制数,构造位运算 ab={aa=b3ab

cici=cici{0,1}

c0c1=c0c2=c1c2=c3

[c0,c1,c2,c3]=[1,0,0,0] or [0,1,0,0] or [0,0,1,0] or [1,1,1,1]

那么就能构造出转移矩阵 [1001010100110001],其逆矩阵 [1001010100110001]

每一位的运算还可以不一样,模拟赛考过,不知道有没有原题,反正同样是可以 FWT 求出的。

更多内容:位运算卷积(FWT) & 集合幂级数

我不会了。

posted @   APJifengc  阅读(139)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示