P3803 【模板】多项式乘法(FFT)FFT模板题

题目链接:https://www.luogu.com.cn/problem/P3803

更好的阅读体验 和 效率更高的实现 来自 自为风月马前卒 大佬 的博客

我的代码实现:

  1. 使用了 STL 提供的 complex (太懒了,所以没有自己实现 Complex)
  2. 使用的递归版本(非递归版本还有细节,暂时不想研究了)

示例程序:

#include <bits/stdc++.h>
using namespace std;
using cd = complex<double>;
const double PI = acos(-1);

void fft(vector<cd>&a, int type) {
    int n = a.size();
    if (n == 1) return;

    vector<cd> a0(n/2), a1(n/2);
    for (int i = 0; i < n/2; i++) {
        a0[i] = a[i * 2];
        a1[i] = a[i * 2 + 1];
    }

    fft(a0, type);
    fft(a1, type);

    cd wn(cos(2 * PI / n), type * sin(2 * PI / n));
    cd w(1, 0);

    for (int k = 0; k < n/2; k++) {
        cd t = w * a1[k];
        a[k] = a0[k] + t;
        a[k + n/2] = a0[k] - t;
        w *= wn;
    }
}

int n, m, limit = 1;

int main() {
    scanf("%d%d", &n, &m);
    while (limit < n + m + 1)
        limit <<= 1;
    vector<cd> a(limit), b(limit);
    for (int i = 0; i <= n; i++) {
        double x;
        scanf("%lf", &x);
        a[i].real(x);
    }
    for (int i = 0; i <= m; i++) {
        double x;
        scanf("%lf", &x);
        b[i].real(x);
    }

    fft(a, 1);
    fft(b, 1);

    for (int i = 0; i < limit; i++)
        a[i] *= b[i];

    fft(a, -1);

    for (int i = 0; i <= n+m; i++)
        printf("%d ", (int)(a[i].real() / limit + 0.5));

    return 0;
}
posted @ 2026-04-09 13:51  quanjun  阅读(3)  评论(0)    收藏  举报