快速沃尔什变换FWT

il void fwt(int *s,int tp){
    for(int i=0;i<t;i++)if(i<v[i])swap(s[i],s[v[i]]);
    for(int i=1;i<t;i<<=1){
        for(int j=0;j<t;j+=i<<1){
            for(int k=0;k<i;k++){
                int A=s[j+k],B=s[i+j+k];
                s[j+k]=mu(A,B);s[i+j+k]=mu(A,p-B);
                if(tp==-1)s[k+j]=1ll*s[j+k]*inv2%p,s[i+j+k]=1ll*s[i+j+k]*inv2%p;
            }
        }
    }
}
异或

与和或的日后填坑

原文地址:https://www.cnblogs.com/Jessie-/p/10271606.html