MnZn 求助多项式
查看原帖
MnZn 求助多项式
420129
Nt_Tsumiki楼主2024/5/16 21:58

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;
}
2024/5/16 21:58
加载中...