版权声明:转载需要注明哦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));
}
}