快速莫比乌斯/沃尔什变换 (FMT/FWT)
快速莫比乌斯/沃尔什变换 (FMT/FWT)
这个东西是用来求 二进制位运算 的卷积的,
引入
我们要求的是:
考虑像 FFT 一样,先将一个式子计算出它的正变换后的式子,再相乘,最后做一次逆变换。于是我们先定义一个式子:
其中,
然后,我们需要它满足(后面那个是按位乘):
接着,我们继续推:
于是我们可以得到
接下来我们继续考虑求这个式子;
考虑像 FFT 一样拆成两半,设
然后我们对首位拆开来考虑,设
接着分类讨论
最终我们得到了这样的式子,与 FFT 类似,我们可以分治。对于求出
OR卷积
对于
而:
接着我们考虑前面那个分治的式子:
此时我们容易发现,对于
然后我们再通过求矩阵的逆 ,可以得到矩阵
所以
逆变换式子为:
最终我们把系数代入,分治求答案就好了。
AND卷积
与
此时
逆变换的式子:
XOR卷积
这部分使用
我们根据
根据
由于
又因为
由于
而当
然后我们就能够构造出转移系数的矩阵
正变换式子:
逆变换式子:
最终,我们得出了以上三种卷积的
Code
#include<cstdio> using namespace std; const int N=1e6+5,M=998244353,NY=499122177; long long a[N],b[N],c[N],ansa[N],ansb[N],ansc[N]; int n; void OR(int flag) { int i,j,len,p; for(len=2,p=1;len<=n;len=len<<1,p=p<<1) { for(i=0;i<n;i+=len) { for(j=0;j<p;j++) c[i+j+p]=(c[i+j+p]+c[i+j]*flag+M)%M; } } } void get_OR() { int i; for(i=0;i<n;i++) c[i]=a[i]; OR(1); for(i=0;i<n;i++) { ansa[i]=c[i];c[i]=b[i]; } OR(1); for(i=0;i<n;i++) c[i]=ansa[i]*c[i]%M; OR(-1); for(i=0;i<n;i++) ansa[i]=c[i]; } void AND(int flag) { int i,j,len,p; for(len=2,p=1;len<=n;len=len<<1,p=p<<1) { for(i=0;i<n;i+=len) { for(j=0;j<p;j++) c[i+j]=(c[i+j+p]*flag+c[i+j]+M)%M; } } } void get_AND() { int i; for(i=0;i<n;i++) c[i]=a[i]; AND(1); for(i=0;i<n;i++) { ansb[i]=c[i];c[i]=b[i]; } AND(1); for(i=0;i<n;i++) c[i]=ansb[i]*c[i]%M; AND(-1); for(i=0;i<n;i++) ansb[i]=c[i]; } void XOR(long long x) { int i,j,len,p;long long t; for(len=2,p=1;len<=n;len=len<<1,p=p<<1) { for(i=0;i<n;i+=len) { for(j=0;j<p;j++) { t=c[i+j+p]; c[i+j+p]=(c[i+j]-t+M)*x%M; c[i+j]=(c[i+j]+t)*x%M; } } } } void get_XOR() { int i; for(i=0;i<n;i++) c[i]=a[i]; XOR(1); for(i=0;i<n;i++) { ansc[i]=c[i];c[i]=b[i]; } XOR(1); for(i=0;i<n;i++) c[i]=ansc[i]*c[i]%M; XOR(NY); for(i=0;i<n;i++) ansc[i]=c[i]; } int main() { int i; scanf("%d",&n); n=(1<<n); for(i=0;i<n;i++) scanf("%lld",&a[i]); for(i=0;i<n;i++) scanf("%lld",&b[i]); get_OR(); get_AND(); get_XOR(); for(i=0;i<n;i++) printf("%lld ",ansa[i]); printf("\n"); for(i=0;i<n;i++) printf("%lld ",ansb[i]); printf("\n"); for(i=0;i<n;i++) printf("%lld ",ansc[i]); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!