Fast Fourier Transform
FFT在信号处理中有重要的应用,在算法中的主要应用是加速多项式运算
——eg.多项式乘法,多项式取模,多项式求逆元…。由于不会LATEX公式,具体讲解请看澈哥博客(也可以看算导
),我就只粘个代码好了。。。
//迭代版
#include <cstdio>
#include <cmath>
#include <complex>
using namespace std;
typedef complex<double> C;
const int MAXN=262145;
const double PI=acos(-1);
int pos[MAXN],bit,n,m;
C a[MAXN],b[MAXN];
void FFT(C A[],short type){
for(int i=1;i<n;++i){
if(i<pos[i])
swap(A[i],A[pos[i]]);
}
for(int i=1;i<n;i<<=1){
C wn(cos(PI/i),type*sin(PI/i));
for(int j=0,tmp=i<<1;j<n;j+=tmp){
C w(1,0);
for(int k=0;k<i;++k,w*=wn){
C x=A[j+k],y=w*A[i+j+k];
A[j+k]=x+y,A[i+j+k]=x-y;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0,x;i<=n;++i)
scanf("%d",&x),a[i]=x;
for(int i=0,x;i<=m;++i)
scanf("%d",&x),b[i]=x;
m+=n;
for(n=1;n<m;n<<=1) ++bit;
for(int i=1;i<n;++i)
pos[i]=(pos[i>>1]>>1)|((i&1)<<(bit-1));
FFT(a,1),FFT(b,1);
for(int i=0;i<=n;++i)
a[i]*=b[i];
FFT(a,-1);
for(int i=0;i<=m;++i)
printf("%d ",int(a[i].real()/n+0.5));
return 0;
}