【模版】多项式乘法(FFT

...

我只能说大概懂,但是现在用不到,没细学

代码就是写个模版,到博客里吃灰吧(bushi

 

#include<bits/stdc++.h>

using namespace std;
const int N=6e6+7;
const double pi=acos(-1);

int n,m;
struct node
{
    double x,y;
    node operator + (const node&t) const 
    {
        return {x+t.x ,y+t.y};
    }
    node operator - (const node&t) const
    {
        return {x-t.x ,y-t.y};
    }
    node operator * (const node&t) const
    {
        return {x*t.x -y*t.y ,x*t.y+y*t.x};
    }
}a[N],b[N];

int rev[N],bit,cnt;

void fft(node a[],int inv)
{
    for(int i=0;i<cnt;i++)
        if(i<rev[i])
            swap(a[i],a[rev[i]]);
    
    for(int mid=1;mid<cnt;mid<<=1)
    {
        node wl=node({cos(pi/mid),inv*sin(pi/mid)});
        
        for(int i=0;i<cnt;i+=(mid<<1))
        {
            node wr=node({1,0});
            
            for(int j=0;j<mid;j++,wr=wr*wl)
            {
                node x=a[i+j],y=wr*a[i+j+mid];
                a[i+j]=x+y;
                a[i+j+mid]=x-y;
            }
            
        }
        
    }
            
    return ;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    
    for(int i=0;i<=n;i++)
    cin>>a[i].x;
    for(int i=0;i<=m;i++)
    cin>>b[i].x;
    
    while((1<<bit)<n+m+1)
    bit++;
    cnt=1<<bit;
    
    for(int i=0;i<cnt;i++)
    {
        rev[i]=( (rev[i>>1]>>1)|((i&1)<<(bit-1)) );
    }
    
    fft(a,1);
    fft(b,1);
    
    for(int i=0;i<cnt;i++)
    a[i]=a[i]*b[i];
    fft(a,-1);
    
    for(int i=0;i<=n+m;i++)
    cout<<(int)(a[i].x/cnt+0.5)<<' ';

    return 0;
}

 

上一篇:【数学】快速傅里叶变换(FFT)


下一篇:ITK:计算图像的逆FFT