求多项式乘法
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=1<<20;
const double PI=acos(-1);
struct Complex
{
double x,y;
Complex operator+ (const Complex &t) const
{
return {x+t.x,y+t.y};
}
Complex operator- (const Complex &t) const
{
return {x-t.x,y-t.y};
}
Complex operator* (const Complex &t) const
{
return {x*t.x-y*t.y,x*t.y+y*t.x};
}
}a[M],b[M];
int rev[M],bit,tot,num[M];
void fft(Complex a[],int inv)
{
for(int i=0;i<tot;i++)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int mid=1;mid<tot;mid<<=1)
{
Complex w1=Complex({cos(PI/mid),inv*sin(PI/mid)});
for(int i=0;i<tot;i+=mid*2)
{
Complex wk=Complex({1,0});
for(int j=0;j<mid;j++,wk=wk*w1)
{
Complex x=a[i+j],y=wk*a[i+j+mid];
a[i+j]=x+y,a[i+j+mid]=x-y;
}
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) scanf("%lf",&a[i]);
for(int i=0;i<=m;i++) scanf("%lf",&b[i]);
while((1<<bit)<2*N+1) bit++;
tot=1<<bit;
for(int i=0;i<tot;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
fft(a,1),fft(b,1); //正着做得到点表示法
for(int i=0;i<tot;i++) a[i]=a[i]*b[i];
fft(a,-1); //倒着做得到系数
for(int i=0;i<=n+m;i++)
printf("%d",(int)(a[i].x/tot+0.5));
return 0;
}