把FFT模版略微改动一下
#include<cstdio> #include<algorithm> #include<cstring> #include<cstdlib> #include<cmath> using namespace std; const int N=270000; const double Pi=acos(-1); int An,Bn,Cn,n,Rev[N],Step; struct Complex{ double a,b; Complex(){} Complex(double sa,double sb){a=sa;b=sb;} friend Complex operator+(Complex A,Complex B){return Complex(A.a+B.a,A.b+B.b);} friend Complex operator-(Complex A,Complex B){return Complex(A.a-B.a,A.b-B.b);} friend Complex operator*(Complex A,Complex B){return Complex(A.a*B.a-A.b*B.b,A.a*B.b+A.b*B.a);} }A[N],B[N],C[N]; void FFT(Complex *x,int flag){ for(int i=0;i<n;i++)if(i<Rev[i])swap(x[i],x[Rev[i]]); for(int k=1;k<n;k<<=1){ Complex wk=Complex(cos(Pi/k),flag*sin(Pi/k)); for(int i=0;i<n;i+=k<<1){ Complex wkj=Complex(1.0,0.0); for(int j=0;j<k;j++){ Complex a=x[i+j],b=x[i+j+k]*wkj; x[i+j]=a+b; x[i+j+k]=a-b; wkj=wkj*wk; } } } if(flag==-1)for(int i=0;i<n;i++)x[i].a/=n; } int main(){ freopen("2194.in","r",stdin); freopen("2194.out","w",stdout); scanf("%d",&An); Bn=An;Cn=An+Bn-1; for(int i=0;i<An;i++)scanf("%lf %lf",&A[i].a,&B[An-i].a); for(n=1,Step=0;n<Cn;n<<=1,Step++); for(int i=0;i<n;i++)Rev[i]=(Rev[i>>1]>>1)|((i&1)<<(Step-1)); FFT(A,1);FFT(B,1); for(int i=0;i<n;i++)C[i]=A[i]*B[i]; FFT(C,-1); for(int i=Cn/2+1;i<=Cn;i++)printf("%d\n",(int)(C[i].a+0.5)); return 0; }