FWT模板求条
  • 板块学术版
  • 楼主Eric998
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/26 21:32
  • 上次更新2024/12/27 16:59:02
查看原帖
FWT模板求条
678534
Eric998楼主2024/12/26 21:32
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1<<3,M=998244353,K=3,I=499122177; 
int a[N],b[N],c[N],n,mat[4];
void assign(int a,int b,int c,int d){
	mat[0]=a,mat[1]=b,mat[2]=c,mat[3]=d;
}
void FWT(int* x){
	for(int i=0;i<K;i++)
		for(int j=0;j<(2<<i);j++)
			if(!((j>>i)&1)){
				int l=x[j],r=x[j+(1<<i)];
				int v[2]={mat[0]*l+mat[1]*r,mat[2]*l+mat[3]*r};
				x[j]=v[0]%M,x[j+(1<<i)]=v[1]%M;
			}
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=0;i<(1<<n);i++)cin>>a[i];
	for(int i=0;i<(1<<n);i++)cin>>b[i];
	//OR
	assign(1,0,1,1);
	FWT(a),FWT(b);
	for(int i=0;i<N;i++)c[i]=a[i]*b[i];
	assign(1,0,-1,1);
	FWT(a),FWT(b),FWT(c);
	for(int i=0;i<(1<<n);i++)cout<<c[i]<<' ';
	cout<<endl;
	//AND
	assign(1,1,0,1);
	FWT(a),FWT(b);
	for(int i=0;i<N;i++)c[i]=a[i]*b[i];
	assign(1,-1,0,1);
	FWT(a),FWT(b),FWT(c);
	for(int i=0;i<(1<<n);i++)cout<<c[i]<<' ';
	cout<<endl;
	//XOR
	assign(1,1,1,-1);
	FWT(a),FWT(b);
	for(int i=0;i<N;i++)c[i]=a[i]*b[i];
	assign(I,I,I,I-1);
	FWT(a),FWT(b),FWT(c);
	for(int i=0;i<(1<<n);i++)cout<<c[i]<<' ';
	cout<<endl;
}
2024/12/26 21:32
加载中...