标签:
#include<bits/stdc++.h> #define ll long long #define N 600005 using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();} return x*f; } struct CD{ double x,y; CD(double a=0,double b=0){x=a,y=b;} friend CD operator + (CD n1,CD n2){return CD(n1.x+n2.x,n1.y+n2.y);} friend CD operator - (CD n1,CD n2){return CD(n1.x-n2.x,n1.y-n2.y);} friend CD operator * (CD n1,CD n2){return CD(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);} }; const double Pi=acos(-1.0); int bit,n,m,nn; CD a[N],b[N]; void FFT(CD *a,int n,int type){ for(int i=0,j=0;i<n;i++) { if(j>i)swap(a[i],a[j]); int k=n; while(j&(k >>= 1))j&=~k; j|=k; } for(int i=1;i<=bit;i++){ CD w_n(cos(2*type*Pi/(1<<i)),sin(2*type*Pi/(1<<i))); for(int j=0;j<n;j+=(1<<i)){ CD w(1,0); for(int k=j;k<j+(1<<(i-1));k++){ CD tmp=a[k],tt=w*a[k+(1<<(i-1))]; a[k]=tmp+tt; a[k+(1<<(i-1))]=tmp-tt; w=w*w_n; } } } if(type<0)for(int i=0;i<n;i++)a[i].x/=n; } int main(){ n=read();m=read();n++;m++; for(int i=0;i<n;i++)scanf("%lf",&a[i].x),a[i].y=0.0; for(int i=0;i<m;i++)scanf("%lf",&b[i].x),b[i].y=0.0; bit=1; while((1<<bit)<(n+m-1))bit++; nn=1<<bit; for(int i=n;i<nn;i++)a[i]=CD(0.0,0.0); for(int i=m;i<nn;i++)b[i]=CD(0.0,0.0); FFT(a,nn,1);FFT(b,nn,1); for(int i=0;i<nn;i++)a[i]=a[i]*b[i]; FFT(a,nn,-1); for(int i=0;i<(n+m-1);i++)printf("%d ",(int)(a[i].x+0.5)); return 0; }
标签:
原文地址:http://www.cnblogs.com/wjyi/p/5550993.html