FWT+FMT模板小记

版权声明:转载需要注明哦QwQ,地址:http://blog.csdn.net/effervescence。 https://blog.csdn.net/Effervescence/article/details/82118065

FMT

inline void FMT(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;++j)
            if(j&i)
                x[j]=Add(x[j],x[j^i]);
}
inline void IFMT(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;++j)
            if(j&i)
                x[j]=Sub(x[j],x[j^i]);
}

FWT

inline void FWTor(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k)
                x[j+k+i]=Add(x[j+k],x[j+k+i]);
}
inline void IFWTor(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k)
                x[j+k+i]=Sub(x[j+k],x[j+k+i]);
}
inline void FWTand(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k)
                x[j+k]=Add(x[j+k],x[j+k+i]);
}
inline void IFWTand(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k)
                x[j+k]=Sub(x[j+k],x[j+k+i]);
}
inline void FWTxor(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k) {
                int y=x[j+k],z=x[j+k+i];
                x[j+k]=Add(y,z),x[j+k+i]=Sub(y,z);
            }
}
inline void IFWTxor(vector<int>&x) {
    for(int i=1;i<lim;i<<=1)
        for(int j=0;j<lim;j+=(i<<1))
            for(int k=0;k<i;++k) {
                int y=x[j+k],z=x[j+k+i];
                x[j+k]=Half(Add(y,z)),x[j+k+i]=Half(Sub(y,z));
            }
}

猜你喜欢

转载自blog.csdn.net/Effervescence/article/details/82118065
FWT