【learning】快速沃尔什变换FWT (2)

  然后如果是求异或或者是或运算的话,那直接改一下
\[ (A_0,A_1)\otimes (B_0,B_1)=(A_0\otimes B_0+A_0\otimes B_1+A_1\otimes B_0,A_1\otimes B_1) \]
​  这个式子的左边然后再用同样的方法算一下就好了

  xor的话就是:\(,(A_0\otimes B_0+A_1\otimes B_1,A_0\otimes B_1+A_1\otimes B_0)\)

  or的话就是:\(,(A_0\otimes B_0,A_0\otimes B_1+A_1\otimes B_0+A_1\otimes B_1)\)

​  

  代码什么的长得跟FFT其实差不多。。。哦不对。。会短很多ovo

​  大概是长这个样子:

#define OR 0 #define AND 1 #define XOR 2 void fwt(int *a,int op,int type,int len){//op=1为FWT,否则为逆FWT int v,u; for (int step=2;step<=len;step<<=1) for (int st=0;st<len;st+=step) for (int i=0;i<step>>1;++i){ u=a[st+i]; v=a[st+i+(step>>1)];//u=A0,v=A1 if (op==1){ if (type==XOR) a[st+i]=(u+v)%MOD,a[st+i+(step>>1)]=(u+MOD-v)%MOD; else if (type==AND) a[st+i]=(u+v)%MOD; else a[st+i+(step>>1)]=(u+v)%MOD; } else{ if (type==XOR) a[st+i]=1LL*(u+v)*inv2%MOD,a[st+i+(step>>1)]=1LL*(1LL*u+MOD-v)*inv2%MOD; else if (type==AND) a[st+i]=(1LL*u-v+MOD)%MOD; else a[st+i+(step>>1)]=(1LL*v-u+MOD)%MOD;//v-u!! } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsjfw.html