P3803 【模板】多项式乘法(FFT)FFT模板题
题目链接:https://www.luogu.com.cn/problem/P3803
更好的阅读体验 和 效率更高的实现 来自 自为风月马前卒 大佬 的博客
我的代码实现:
- 使用了 STL 提供的 complex (太懒了,所以没有自己实现 Complex)
- 使用的递归版本(非递归版本还有细节,暂时不想研究了)
示例程序:
#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;
}
浙公网安备 33010602011771号