[学习笔记]快速傅里叶变换 FFT
来源:互联网 发布:淘宝客qq群里的优惠券 编辑:程序博客网 时间:2024/06/05 20:58
屯板子
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#define N 2621450#define pi P_Pusing namespace std;const double pi=acos(-1);struct E{ double x,y; E(double _x=0.0,double _y=0.0) { x=_x,y=_y; } inline E operator=(const E &w) { this->x=w.x,this->y=w.y;return *this; } inline E operator+(const E &w) { return E(x+w.x,y+w.y); } inline E operator-(const E &w) { return E(x-w.x,y-w.y); } inline E operator*(const E &w) { return E(x*w.x-y*w.y,x*w.y+y*w.x); } inline E operator*=(const E &w) { return (*this)=(*this)*w; }}a[N],b[N];int r[N];inline int FFT(E *a,int n,int sgn){ for(int i=0;i<n;i++) if(i<r[i]) swap(a[i],a[r[i]]); for(int i=1;i<n;i<<=1) { E wn(cos(pi/i),sgn*sin(pi/i)); for(int p=i<<1,j=0;j<n;j+=p) { E w(1.0,0.0); for(int k=0;k<i;k++,w*=wn) { E x=a[j+k],y=w*a[j+k+i]; a[j+k]=x+y,a[j+k+i]=x-y; } } } return 0;}#define gc getchar()inline int inn(){ int x;while((x=gc)<'0'||x>'9');return x^'0'; }#undef gcint main(){ int n,m,L;scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) a[i]=E(inn(),0.0); for(int i=0;i<=m;i++) b[i]=E(inn(),0.0); for(m+=n,n=1,L=0;n<=m;n<<=1,L++); for(int i=0;i<n;i++) r[i]=((r[i>>1]>>1)|((i&1)<<(L-1))); FFT(a,n,1),FFT(b,n,1); for(int i=0;i<=n;i++) a[i]*=b[i]; FFT(a,n,-1); for(int i=0;i<=m;i++) printf("%d ",(int)(a[i].x/n+0.5)); return !printf("\n");}
阅读全文