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模板的主要内容,如果未能解决你的问题,请参考以下文章