FMT是快速莫比乌斯变换,FWT是快速沃尔什变换。
他们两个是用来解决位运算卷积问题的。
详细点来说,已知两个多项式
需要快速求
当
当
当
先摆出板题:
P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
这道题里面只有与运算,或运算和异或运算,我们一个一个看。
我们令一个多项式
下面的所有描述都假设
一个多项式
两个多项式
对于两个自然数
与运算
首先我们定义一个关于多项式的函数
简单来说,就是所有“包含”
我们的目标就是算出
显然我们就可以在
正变换
显然,这样的时间复杂度我们不太可以接受。
所以就会有一个递归公式:
正变换递归公式证明
采用数学归纳法。
当
假设
类比分治的思想,我们将一个区间分成两段,则只需要计算“跨越”中点的贡献,两边进行分治即可。
现在我们想要计算的就是
对于一个下标
仔细看这个
至此,我们可以在
相乘
首先有一个结论:
逆变换
现在我们知道了
我们定义
我们可以从
和暴力
显然,万恶的出题人表示无法接受。
所以还是有一个递归公式:
逆变换递归公式证明
首先我们根据数学归纳法证明
再进行数学归纳法证明
当
根据定义展开:
或运算
其实这里和与运算差不多,会的小伙伴可以忽略。
我们还是定义一个关于多项式的函数
简单来说,就是所有
我们的目标就是算出
显然我们就可以在
正变换
显然,这样的时间复杂度我们不太可以接受。
所以就会有一个递归公式:
正变换递归公式证明
采用数学归纳法。
当
假设
类比分治的思想,我们将一个区间分成两段,则只需要计算“跨越”中点的贡献,两边进行分治即可。
现在我们想要计算的就是
对于一个下标
仔细看这个
所以这个公式显然是正确的。
至此,我们可以在
相乘
首先有一个结论:
逆变换
现在我们知道了
我们定义
我们可以从
和暴力
显然,万恶的出题人表示无法接受。
所以还是有一个递归公式:
逆变换递归公式证明
首先我们根据数学归纳法证明
再进行数学归纳法证明
当
根据定义展开:
异或运算
这里就不是 FMT 了,就是 FWT 了。
我们还是定义一个关于多项式的函数
我们的目标还是算出
显然我们就可以在
正变换
这个复杂度我都看不下去了。
所以又会有一个递归公式:
正变换递归公式证明
采用数学归纳法。
当
假设
类比分治的思想,我们将一个区间分成两段,则只需要计算“跨越”中点的贡献,两边进行分治即可。
先来考虑
对于两个数字
即
所以实际上
同样,
只是这个时候要注意,因为
即
相乘
还是有一个结论:
考虑所有
如果某一位
如果某一位
综上所述,
所以说,我们就可直接将
逆变换
现在我们知道了
定义递归公式
现在我们想要证明
逆变换递归公式证明
首先我们根据数学归纳法证明
再进行数学归纳法证明
当
根据定义展开:
代码放上: