模板
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;
}
}
}
}
}
用法
变换->相乘->逆变换