莫比乌斯变换&子集卷积

今天学习莫比乌斯变换。

大佬の博客

前置技能

fwt与运算。
其实就是这个的低配版本

干嘛用的?

用来快速计算子集卷积。
就是说,
f [ i ] = ∑ g [ j ] ∗ h [ k ] ( j ∣ k = i & & j & k = 0 ) f[i]=\sum {g[j]*h[k]}{(j|k=i\&\&j\&k=0)} f[i]=g[j]h[k](jk=i&&j&k=0)

核心思想

打包运算。
首先我们考虑它的低配版本。
f [ i ] = ∑ g [ j ] ∗ h [ k ] ( j ∣ k = i ) f[i]=\sum {g[j]*h[k]}{(j|k=i)} f[i]=g[j]h[k](jk=i)
我们定义f1[i]表示所有i的子集的和。
不如直接看图算了。.

手写赛高
这样我们就实现了打包运算:h’[i]表示所有下标是i的子集的答案之和。

所以呢?

考虑我们算重了什么。
我们会把有交集的下标算进去,比如 2 & 3 = 2 2\&3=2 2&3=2实际上是不行的。

怎么办?

统计位数。
令f[i][j]表示下标为i,i中有j个1的f的对应变换,即只考虑所有 p o p c o u n t ( i ) = = j popcount(i)==j popcount(i)==j的原f数组为对应值。
然后枚举两边的1个数,只有所有1的个数与下标实际1的个数相同的才会产生贡献。
(否则就是打包出锅了。)

怎么反演?

最后对于每个下标处相乘时多项式反演即可。
n 2 n^2 n2即可。
小朋友化式子法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值