社区讨论
求助,有人知道FFT最后为什么要取fabs吗?
P3803【模板】多项式乘法(FFT)参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pwebd
- 此快照首次捕获于
- 2025/11/21 01:40 4 个月前
- 此快照最后确认于
- 2025/11/21 01:40 4 个月前
结果果然还是遇到了一些不能理解的地方
是按照
洛谷日报上的板子写的,发现最后取值是需要取绝对值的,但是不知道为什么.去掉以后就了一个点,万一卷积系数本来就是负数怎么办??code#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 条回复,欢迎继续交流。
正在加载回复...