集合幂级数

1|0定义

设全集为 U={0,2,,n1},设 F 为一个域,称 f:2UFF 上的一个集合幂级数。对于每个 S2U,记 fSS 代入 f 后的函数值,也称其为该集合幂级数的第 S 项系数。

f=S2UfSxS

来表示一个集合幂级数。

集合幂级数的加减法为对应系数的运算。

2|0卷积

2|1定义

h=fgS2UhSxS=(L2UfLxL)(R2UgRxR)=L2UR2U(fLxL)(gRxR)

定义一种运算 ,使其满足交换律,结合律,存在单位元,使得:

(fLxL)(gRxR)=fLgRxLR

这样定义还满足加法的分配律。

2|2集合并卷积

LR=LR,该卷积称为集合并卷积。若 h=fg,则有:

hS=L2UR2U[LR=S]fLgR

定义 f 的莫比乌斯变换为:

f^S=TSfT

本质为高维前缀和。

由容斥原理,定义 f^ 的莫比乌斯反演为:

fS=TS(1)|S||T|f^T

本质为高维差分。

代入集合并卷积的式子可以得到:

hS=L2UR2U[LR=S]fLgRh^S=L2UR2U[LRS]fLgR=LSRSfLgR=(LSfL)(RSgR)=f^Sg^S

快速进行莫比乌斯变换和莫比乌斯反演后即可 O(n2n) 计算集合并卷积。

void FWT_or(ll *a,int type) { for(int len=1;len<all;len<<=1) for(int i=0;i<all;i+=len<<1) for(int j=i;j<i+len;++j) a[j+len]=(a[j+len]+a[j]*type)%p; }

2|3集合交卷积

LR=LR,该卷积称为集合交卷积。若 h=fg,则有:

hS=L2UR2U[LR=S]fLgR

定义 f 的莫比乌斯变换为:

f^S=STfT

本质为高维前缀和。

由容斥原理,定义 f^ 的莫比乌斯反演为:

fS=ST(1)|S||T|f^T

本质为高维差分。

代入集合交卷积的式子可以得到:

hS=L2UR2U[LR=S]fLgRh^S=L2UR2U[SLR]fLgR=SLSRfLgR=(SLfL)(SRgR)=f^Sg^S

快速进行莫比乌斯变换和莫比乌斯反演后即可 O(n2n) 计算集合交卷积。

void FWT_and(ll *a,int type) { for(int len=1;len<all;len<<=1) for(int i=0;i<all;i+=len<<1) for(int j=i;j<i+len;++j) a[j]=(a[j]+a[j+len]*type)%p; }

2|4集合对称差卷积

LR=LR,该卷积称为集合对称差卷积。若 h=fg,则有:

hS=L2UR2U[LR=S]fLgR

对于一个集合 S,有:

12nT2U(1)|ST|=[S=]

S 为空集时,(1)|ST| 恒为 1,等式成立。当 S 不为空集时,将 (1)|ST| 两两配对即可。

也可以枚举交集来证明:

T2U(1)|ST|=2n|S|TS(1)|T|=2n|S|[S=]

代入集合对称差卷积的式子可以得到:

hS=L2UR2U[LRS=0]fLgR=L2UR2U12nT2U(1)|(LRS)T|fLgR=L2UR2U12nT2U(1)|LT|(1)|RT|(1)|ST|fLgR=12nT2U(1)|ST|(L2U(1)|LT|fL)(R2U(1)|RT|gR)

因此,定义 f 的沃尔什变换为:

f^S=T2U(1)|ST|fT

f^ 的沃尔什逆变换为:

fS=12nT2U(1)|ST|f^T

那么对于集合对称差卷积就有 h^S=f^Sg^S

|U|=nFWT 本质为每一维长度为 2nFFT

快速进行沃尔什变换和沃尔什逆变换后即可 O(n2n) 计算集合对称差卷积。

void FWT_xor(ll *a,int type) { for(int len=1;len<all;len<<=1) { for(int i=0;i<all;i+=len<<1) { for(int j=i;j<i+len;++j) { ll x=a[j],y=a[j+len]; a[j]=(x+y)%p,a[j+len]=(x-y+p)%p; if(type<0) a[j]=a[j]*inv%p,a[j+len]=a[j+len]*inv%p; } } } }

2|5子集卷积

为不相交集合并,即当 AB 时,AB 未定义,即 xAxB=0,否则为 AB,称该卷积为子集卷积。若 h=fg,则有:

hS=LSRS[LR=S][LR=]fLgR

注意到 [LR=S][LR=]=[LR=S][|L|+|R|=|S|],因此定义 f 的集合占位幂级数 a,满足 i|S|,ai,S=0a|S|,S=fS,那么有:

c^k,S=i+j=ka^i,Sb^j,S

也就是进行莫比乌斯变换后,对占位幂级数中的形式幂级数进行卷积,复杂度为 O(n22n)

for(int i=0;i<=n;++i) FWT(f[i],1),FWT(g[i],1); for(int i=0;i<=n;++i) for(int j=0;j<=i;++j) for(int s=0;s<all;++s) h[i][s]=(h[i][s]+(ll)f[i-j][s]*g[j][s]%p)%p; for(int i=0;i<=n;++i) FWT(h[i],-1);

__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/12548538.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(590)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示