bzoj2194: 快速傅立叶之二
入门FFT第二题,感觉题目还不错,挺好的利用的FFT。题解就是把其中一个反过来做一遍FFT就好了。
#include<bits/stdc++.h> #define pi acos(-1) using namespace std; typedef complex <double> E; int n,m; E a[500000],b[500000]; void FFT(E *x,int n,int type) { if(n==1)return; E l[n>>1],r[n>>1]; for(int i=0;i<n;i+=2) l[i>>1]=x[i],r[i>>1]=x[i+1]; FFT(l,n>>1,type);FFT(r,n>>1,type); E wn(cos(2*pi/n),sin(type*2*pi/n)),w(1,0),t; for(int i=0;i<n>>1;i++,w*=wn) t=w*r[i],x[i]=l[i]+t,x[i+(n>>1)]=l[i]-t; } int main() { //freopen("fft.in","r",stdin); //freopen("fft.out","w",stdout); scanf("%d",&n); for(m=1;m<=n*2;m<<=1); for(int i=0;i<n;i++) { int aa,bb; scanf("%d%d",&aa,&bb); a[i]=aa;b[n-i-1]=bb; } FFT(a,m,1);FFT(b,m,1); for(int i=0;i<=m;i++)a[i]=a[i]*b[i]; FFT(a,m,-1); for(int i=n-1;i<n*2-1;i++) printf("%d\n",(int)(a[i].real()/m+0.5)); return 0; }