模板
or运算
void FWT(int *a,int n,int f){ for(int k=1;k<n;k<<=1){ for(int i=0;i<n;i+=(k<<1)){ for(int j=0;j<k;++j){ if(f==1)a[i+k+j]+=a[i+j]; else a[i+k+j]-=a[i+j]; } } } }
and运算
void FWT(int *a,int n,int f){ for(int k=1;k<n;k<<=1){ for(int i=0;i<n;i+=(k<<1)){ for(int j=0;j<k;++j){ if(f==1)a[i+j]+=a[i+j+k]; else a[i+j]-=a[i+j+k]; } } } }
xor运算
void FWT(int *a,int n,int f){ for(int k=1;k<n;k<<=1){ for(int i=0;i<n;i+=(k<<1)){ for(int j=0;j<k;++j){ int t1=a[i+j],t2=a[i+j+k]; if(f==1){ a[i+j]=t1+t2; a[i+j+k]=t1-t2; }else{ a[i+j]=(t1+t2)/2; a[i+j+k]=(t1-t2)/2; } } } } }
用法
变换->相乘->逆变换