rt
请问 FFT 和 NTT 在代码上有什么区别,以下方 FFT 代码为例。
#include <iostream>
#include <complex>
#include <cstdio>
#include <cmath>
#define N 4000001
#define com complex<double>
using namespace std;
int n,m;
com A[N],B[N];
const double PI=acos(-1.0);
void FFT(com *A,int n,int op) {
if (n==1) return;
com A1[n>>1],A2[n>>1];
for (int i=0;i<(n>>1);i++) A1[i]=A[i<<1],A2[i]=A[i<<1|1];
FFT(A1,n>>1,op),FFT(A2,n>>1,op);
com w1={cos(2*PI/n),sin(2*PI/n)*op},wk={1,0};
for (int i=0;i<(n>>1);i++) {
A[i]=A1[i]+A2[i]*wk;
A[i+n/2]=A1[i]-A2[i]*wk;
wk*=w1;
}
}
int main() {
scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++) cin>>A[i];
for (int i=0;i<=m;i++) cin>>B[i];
m=n+m,n=1; while (n<=m) n<<=1;
FFT(A,n,1),FFT(B,n,1);
for (int i=0;i<n;i++) A[i]*=B[i];
FFT(A,n,-1);
for (int i=0;i<=m;i++) printf("%.0lf ",floor(A[i].real()/n+0.5));
return 0;
}