題目大意:給定兩個長度為n的序列a和b,求c[k]=Σa[i]*b[i-k]
這東西不是卷積的形式,因此我們將b數組反轉,之後就是卷積的形式了
然後就愉♂悅地上FFT吧
#include#include #include #include #include #define M 263000 #define PI 3.1415926535897932384626433832795028841971 using namespace std; struct Complex{ double a,b; Complex() {} Complex(double _,double __):a(_),b(__) {} Complex operator + (const Complex &x) const { return Complex(a+x.a,b+x.b); } Complex operator - (const Complex &x) const { return Complex(a-x.a,b-x.b); } Complex operator * (const Complex &x) const { return Complex(a*x.a-b*x.b,a*x.b+b*x.a); } void operator *= (const Complex &x) { *this=(*this)*x; } }a[M],b[M],p[M]; int n; void FFT(Complex x[],int n,int type) { static Complex temp[M]; if(n==1) return ; int i; for(i=0;i >1]=x[i],temp[i+n>>1]=x[i+1]; memcpy(x,temp,sizeof(Complex)*n); Complex *l=x,*r=x+(n>>1); FFT(l,n>>1,type);FFT(r,n>>1,type); Complex root(cos(type*2*PI/n),sin(type*2*PI/n)),w(1,0); for(i=0;i >1;i++,w*=root) temp[i]=l[i]+w*r[i],temp[i+(n>>1)]=l[i]-w*r[i]; memcpy(x,temp,sizeof(Complex)*n); } int main() { int i,digit; cin>>n; for(i=0;i