第一道FFT
话说后缀数组我只会敲模版……这几天的比赛验证了我连暴力都能写挂
但是最近好像碰到好多FFT题目,于是就学习了一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include<cstdio> #include<algorithm> #include<cstdlib> #include<cmath> #include<cstring> using namespace std; const double Pi=2* asin (1); const int NUM_SIZE=100005; int An,Bn,Cn,Rev[NUM_SIZE*3],Step,n; struct Complex{ double a,b; Complex( double as=0.0, double bs=0.0){a=as;b=bs;} 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,b.a*a.b+a.a*b.b);} friend Complex operator/(Complex a,Complex b){ return Complex((a.a*b.a+a.b*b.b)/(b.a*b.a+b.b*b.b),(b.a*a.b-a.a*b.b)/(b.a*b.a+b.b*b.b));} double Mod(){ return sqrt (a*a+b*b);} }A[NUM_SIZE*3],B[NUM_SIZE*3],C[NUM_SIZE*3]; template < typename T> void Read(T &x){ int flag=1; char ch; while ((ch= getchar ())< '0' || ch> '9' ) if (ch== '-' )flag=-1; x=ch- '0' ; while ((ch= getchar ())>= '0' && ch<= '9' )x=x*10+ch- '0' ; x*=flag; } 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 ( "34.in" , "r" ,stdin); freopen ( "34.out" , "w" ,stdout); Read(An);Read(Bn); An++;Bn++; Cn=An+Bn-1; for ( int i=0;i<An;i++)Read(A[i].a); for ( int i=0;i<Bn;i++)Read(B[i].a); for (n=1,Step=0;n<Cn;Step++,n<<=1); 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=0;i<Cn;i++) printf ( "%d " ,( int )(C[i].a+0.5)); putchar ( '\n' ); return 0; } |