P3803 【模板】多项式乘法(FFT)

无人久伴 提交于 2020-02-18 21:21:26

P3803 【模板】多项式乘法(FFT)

懒得写了,推荐2篇好博客,比较清晰易懂。
FFT
FFT

\(\color{blue}{Code}\)

#include<bits/stdc++.h>
using namespace std;
const int N=3000006;
const double pi=acos(-1.0);
struct cp {
    double x,y;
    cp (double xx=0,double yy=0) {
        x=xx,y=yy;
    }
} a[N],b[N];
cp operator + (const cp &a,const cp &b) {
    return cp(a.x+b.x,a.y+b.y);
}
cp operator - (const cp &a,const cp &b) {
    return cp(a.x-b.x,a.y-b.y);
}
cp operator * (const cp &a,const cp &b) {
    return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
int n,m,lim=1,l,rev[N];
void fft(cp *a,int o) {
    for(int i=0; i<lim; ++i)
        if(i<rev[i])swap(a[i],a[rev[i]]);
    for(int i=1; i<lim; i<<=1) {
        cp wn(cos(pi/i),o*sin(pi/i));
        for(int j=0; j<lim; j+=(i<<1)) {
            cp w0(1,0);
            for(int k=0; k<i; ++k,w0=w0*wn) {
                cp X=a[j+k],Y=w0*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; i<=n; ++i)scanf("%lf",&a[i].x);
    for(int i=0; i<=m; ++i)scanf("%lf",&b[i].x);
    for(; lim<=n+m; lim<<=1,++l);
    for(int i=0; i<lim; ++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    fft(a,1);
    fft(b,1);
    for(int i=0; i<lim; ++i)a[i]=a[i]*b[i];
    fft(a,-1);
    for(int i=0; i<=m+n; ++i)
        printf("%d ",(int)(a[i].x/lim+0.5));
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!