FFT

简单记录模板 \(\text{qwq}\)

#include<bits/stdc++.h>
#define int long long
#define unsigned long long ull
#define int128 __int128
#define PI acos(-1)
#define faster ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int maxn=1e7+10;
int n,m;
struct comp{
    double real,img;
    comp(double xx=0,double yy=0){
        real=xx;
        img=yy;
    }
    comp operator + (const comp b)const{ 
        return comp(real+b.real,img+b.img);
    }
    comp operator - (const comp b)const{ 
        return comp(real-b.real,img-b.img);
    }
    comp operator * (const comp b)const{ 
        return comp(real*b.real-img*b.img,real*b.img+img*b.real);
    }
}a[maxn],b[maxn];
int lim=1,l,r[maxn];
void FFT(comp *A,int opt){
	for(int i=0;i<lim;i++)
	if(i<r[i])swap(A[i],A[r[i]]);
	for(int mid=1;mid<lim;mid<<=1){
		comp wn(cos(PI/mid),opt*sin(PI/mid));
		for(int R=mid<<1,j=0;j<lim;j+=R){
			comp w(1,0);
			for(int k=0;k<mid;k++,w=w*wn){
				comp x=A[j+k],y=w*A[j+mid+k];
				A[j+k]=x+y,A[j+mid+k]=x-y;
			}
		}
	} 
}
void solve(){
	cin>>n>>m;
	for(int i=0;i<=n;i++)cin>>a[i].real;
	for(int i=0;i<=m;i++)cin>>b[i].real;
	while(lim<=n+m)lim<<=1,++l;
	for(int i=0;i<lim;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	FFT(a,1);
	FFT(b,1);
	for(int i=0;i<=lim;i++)a[i]=a[i]*b[i];
	FFT(a,-1);
	for(int i=0;i<=n+m;i++)cout<<(int)(a[i].real/lim+0.5)<<' ';
}
signed main(){
	faster;
	int T=1;
	while(T--)solve();
}
posted @ 2026-01-20 17:12  mo_mo_yu  阅读(2)  评论(0)    收藏  举报