fft解决多项式相乘

http://uoj.ac/problem/34

#include<bits/stdc++.h>
#define N 262145
#define pi acos(-1)
using namespace std;
typedef complex<double> E;

int R[N];
E a[N],b[N];
int lenth=1,Reverse[N];
inline void init(int x)
{
	int tim=0;
	while(lenth<=x)lenth<<=1,tim++;
	for(int i=0;i<lenth;i++)Reverse[i]=(Reverse[i>>1]>>1)|((i&1)<<(tim-1));
}
inline void FFT(E *A,int fla)
{
	for(int i=0;i<lenth;i++)if(i<Reverse[i])swap(A[i],A[Reverse[i]]);
	for(int i=1;i<lenth;i<<=1)
	{
		E w(cos(pi/i),fla*sin(pi/i));
		for(int j=0;j<lenth;j+=(i<<1))
		{
			E K(1,0);
			for(int k=0;k<i;k++,K=K*w)
			{
				E x=A[j+k],y=A[j+k+i]*K;
				A[j+k]=x+y;
				A[j+k+i]=x-y;
			}
		}
	}
}
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	init(n+m);
	int x;
	for(int i=0;i<=n;i++)scanf("%d",&x),a[i]=x;
	for(int i=0;i<=m;i++)scanf("%d",&x),b[i]=x;
	FFT(a,1),FFT(b,1);
	for(int i=0;i<lenth;i++)a[i]=a[i]*b[i];
	FFT(a,-1);
	for(int i=0;i<=n+m;i++)	printf("%d ",(int)(a[i].real()/lenth+0.5));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CC_1012/article/details/91047449
今日推荐