uoj34 FFT

#include<bits/stdc++.h>
#define M 262150
#define eps 1e-7
using namespace std;

inline int read()
{
	char c=getchar(); int ret=0;
	while(c<48||c>57)c=getchar();
	while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
	return ret; 
}

struct fushu
{
	double r, i;
	fushu(){
		r=0;
		i=0;
	}
	fushu (double _r, double _i){
		r=_r;
		i=_i;
	}
	fushu operator + (const fushu & a)
	{
		return (fushu){r+a.r,i+a.i};
	}
	fushu operator - (const fushu & a)
	{
		return (fushu){r-a.r,i-a.i};
	}
	fushu operator * (const fushu & a)
	{
		return (fushu){r*a.r-i*a.i,r*a.i+i*a.r};
	}
};

int N,n,m;
fushu *ans,wn[M],tmp[M],a[M],b[M];

inline void init_wn()
{
	double pi=acos(-1);
	double WN=2.0*pi/N;
	for(int i=0; i<=N; ++i)
	{
		wn[i]=(fushu){cos(WN*i),sin(WN*i)};
	}
}

inline void rev_wn()
{
	for(int i=0; i<=N; ++i)wn[i].i=-wn[i].i;
}

void fft(int n, int s1 , int mi)
{
	if (n==1)return;
	int m=n>>1,len=1<<mi,s2=s1+len;
	fft(m,s1,mi+1); fft(m,s2,mi+1);
	
	int p=s1;
	for(int i=0; i<m; ++i,p+=len<<1)
	{
		fushu del=ans[p+len]*wn[i<<mi];
		tmp[i]=ans[p]+del;
		tmp[i+m]=ans[p]-del;
	}
	for(int i=0; i<n; ++i)ans[s1+(i<<mi)]=tmp[i];
}

int main()
{
	n=read(); m=read();
	for(int i=0; i<=n; ++i)a[i].r=read();
	for(int i=0; i<=m; ++i)b[i].r=read();
	N=1; while(n+m>=N)N<<=1;
	ans=a;
	init_wn();
	fft(N,0,0);
	ans=b;
	fft(N,0,0);
	for(int i=0; i<N; ++i)a[i]=a[i]*b[i];
	ans=a;
	rev_wn();
	fft(N,0,0);
	for(int i=0; i<N; ++i)a[i].r=a[i].r/N;
	for(int i=0; i<=n+m; ++i)printf("%d ",(int)(a[i].r+eps));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值