社区讨论

求助,有人知道FFT最后为什么要取fabs吗?

P3803【模板】多项式乘法(FFT)参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi7pwebd
此快照首次捕获于
2025/11/21 01:40
4 个月前
此快照最后确认于
2025/11/21 01:40
4 个月前
查看原帖
背了模板后开始试图理解原理
结果果然还是遇到了一些不能理解的地方
是按照洛谷日报上的板子写的,发现最后取值是需要取绝对值的,但是不知道为什么.去掉以后就WAWA了一个点,万一卷积系数本来就是负数怎么办??
code
CPP
#include<cstdio>
#include<cmath>
using namespace std;
#define MAX 3000000
const double P=acos(-1);
struct complex
{
    complex(double xx=0,double yy=0)
    {x=xx,y=yy;}double x,y;
}a[MAX];
int n,m,r[MAX];
complex operator + (complex a,complex b){
        return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b){
        return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b){
        return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void fft(complex *f,int p)
{
    for(register int i=0;i<n;i++)
        if(i<r[i])
        {
            register complex tmp=f[i];
            f[i]=f[r[i]];
            f[r[i]]=tmp;
        }
    for(register int h=2;h<=n;h<<=1)
    {
        int len=h>>1;
        complex tmp(cos(P/len),p*sin(P/len));
        for(register int k=0;k<n;k+=h)
        {
            register complex buf(1,0);
            for(register int i=k;i<k+len;i++)
            {
                complex t=buf*f[len+i];
                f[len+i]=f[i]-t;
                f[i]=f[i]+t;
                buf=buf*tmp;
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=0;i<=n;++i)	scanf("%lf",&a[i].x);
    for(register int i=0;i<=m;++i)	scanf("%lf",&a[i].y);
    for(m+=n,n=1;n<=m;n<<=1);
    for(register int i=0;i<n;++i)	r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);
    fft(a,1);
    for(register int i=0;i<n;++i)	a[i]=a[i]*a[i];
    fft(a,-1);
    for(register int i=0;i<=m;++i)
        printf("%.0lf ",abs(a[i].y)/n/2);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...