FWT模板

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FWT模板相关的知识,希望对你有一定的参考价值。


#include<bits/stdc++.h>
using namespace std;
int ppow(int a,int b,int mod){
    int ans=1%mod;a%=mod;
    while(b){if(b&1)ans=1ll*ans*a%mod;a=1ll*a*a%mod;b>>=1;}
    return ans;
}
const int mod=1e9+7;
const int maxm=2e5+5;
const int inv2=ppow(2,mod-2,mod);
int a[maxm];
int b[maxm];
int n,m;
int len;
void fwt_xor(int *a, int op){
    for(int i=1;i<len;i<<=1){
        for(int j=0,p=i<<1;j<len;j+=p){
            for(int k=0;k<i;k++){
                int x=a[j+k],y=a[i+j+k];
                a[j+k]=(x+y)%mod;
                a[i+j+k]=(x-y+mod)%mod;
                if(op==-1){
                    a[j+k]=1ll*a[j+k]*inv2%mod;
                    a[i+j+k]=1ll*a[i+j+k]*inv2%mod;
                }
            }
        }
    }
}
void solve(){
    len=1;
    while(len<m*2)len<<=1;//因为异或会使得值域翻倍,所以这里取上限为m*2,m是值域
    for(int i=0;i<len;i++)a[i]=0;
    for(int i=0;i<len;i++)b[i]=0
    //在这里初始化a[]
    //在这里初始化b[]
    fwt(a,1);//fwt
    fwt(b,1);
    for(int i=0;i<len;i++){//相乘
    	a[i]=a[i]*b[i];
    }
    fwt(a,-1);//ifwt
}
signed main(){
    return 0;
}

以上是关于FWT模板的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 - P4717 模板快速莫比乌斯/沃尔什变换 (FMT/FWT)

FWT模板

FWT模板

FWT模板

2023.4.7模板快速沃尔什变换FWT

Luogu4717 模板快速沃尔什变换(FWT)