pts55错了后四个数据点,没debug出来。(其实是因为太繁琐了XD)感谢大佬们的指正
参考了b站董晓算法G41的代码,但是因为没学过c++所以有些处理会不一样
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <complex.h>
#include <math.h>
#define M_PI 3.14159265358979323846 //这里不这么定义的话,洛谷编译会报错,虽然不是很理解(
void FFT(complex a[],int n,int b)
{
if (n==1) return;
int i;
complex a1[n/2],a2[n/2];
for (i=0;i<n/2;i++){
a1[i]=a[2*i];
a2[i]=a[2*i+1];
}
FFT(a1,n/2,b); FFT(a2,n/2,b);
complex w1=cos(2*M_PI/n)+I*sin(2*M_PI/n)*b;
complex wk=1;
for (i=0;i<n/2;i++){
a[i]=a1[i]+a2[i]*wk;
a[i+n/2]=a1[i]-a2[i]*wk;
wk*=w1;
}
}
int main()
{
complex a[10000],b[10000];
int m,n,i;
scanf("%d%d",&n,&m);
for (i=0;i<=n;i++) scanf("%lf",&a[i]);
for (i=0;i<=m;i++) scanf("%lf",&b[i]);
for (m=m+n,n=1;n<=m;n<<=1);
// printf("%d\n",n); //测试
FFT(a,n,1); FFT(b,n,1);
for (i=0;i<n;i++) a[i]*=b[i];
FFT(a,n,-1);
for (i=0;i<=m;i++) printf("%d ",(int)(creal(a[i])/n+0.5));
return 0;
}