UOJ.多项式乘法FFT

3 篇文章 0 订阅

UOJ#34.多项式乘法FFT

题目在这里呀!
嗯终于算是有点懂FFT了,可我不像其他大神那样能完完整整地讲清楚(毕竟还有一些地方还不懂qwq

这个讲解挺清晰的
既然…是一道模板题,那就贴上模板叭~(这里用到的是迭代法不是递归)

//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 100000+1000
using namespace std;
const double pi=acos(-1.0);
int n,m,L;
struct complex{
    double r,c;
    inline complex operator + (const complex &a){return (complex){r+a.r,c+a.c};}
    inline complex operator - (const complex &a){return (complex){r-a.r,c-a.c};}
    inline complex operator * (const complex &a){return (complex){r*a.r-c*a.c,r*a.c+c*a.r};}
}a[N+N+N],b[N+N+N],w[N+N+N];

void FFT(complex *a,int opt){
    for(int i=0,j=0;i<L;i++){
        if(i>j) swap(a[i],a[j]);
        for(int k=L>>1;(j ^= k)<k;k>>=1);
    }

    for(int len=2;len<=L;len<<=1)
    {
        int l=len>>1;
        complex W=(complex){cos(pi/l),opt*sin(pi/l)};
        for(int i=1;i<l;i++) w[i]=w[i-1]*W;
        for(int i=0;i<L;i+=len)
            for(int j=0;j<l;j++)
            {
                complex x=a[i+j],y=w[j]*a[i+j+l];
                a[i+j]=x+y;a[i+j+l]=x-y;
            }
    }
    if(opt==-1){
        for(int i=0;i<L;i++) a[i].r/=L;
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++) scanf("%lf",&a[i].r);
    for(int i=0;i<=m;i++) scanf("%lf",&b[i].r);
    w[0]=(complex){1.0,0.0};

    L=1;n++;m++;
    while(L<n+m) L<<=1;

    FFT(a,1);FFT(b,1);
    for(int i=0;i<L;i++) a[i]=a[i]*b[i];

    FFT(a,-1);
    for(int i=0;i<n+m-1;i++) printf("%d ",(int)(a[i].r+0.5));
    puts("");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值