然后如果是求异或或者是或运算的话,那直接改一下
\[
(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!! } } }