#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxl = 300000 + 10;
const double PI = acos(-1.0);
int base, c[maxl];
complex<double> a[maxl], b[maxl], p[maxl];
int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
while(ch >='0' && ch <='9') { x = x * 10 + ch - 48; ch = getchar(); }
return x * f;
}
void FFT(complex<double> x[], int n, int type) {
if(n == 1) return;
complex<double> l[n >> 1], r[n >> 1];
for(int i = 0; i < n; i += 2) {
l[i >> 1] = x[i];
r[i >> 1] = x[i + 1];
}
FFT(l, n >> 1, type);
FFT(r, n >> 1, type);
complex<double> wn(cos(type * 2 * PI / n), sin(type * 2 * PI / n)), w(1, 0);
for(int i = 0; i < (n >> 1); w *= wn, i++) {
x[i] = l[i] + w * r[i];
x[i + (n >> 1)] = l[i] - w * r[i];
}
}
int n, m;
int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt", "r", stdin);
freopen("ans.txt", "w", stdout);
#endif
scanf("%d%d", &n, &m);
for(int i=0; i<=n; i++) a[i] = read();
for(int i=0; i<=m; i++) b[i] = read();
for(int x = max(n, m) + 1, i = 1; i >> 2 < x; i <<= 1) base = i;
//cout << base << endl;
FFT(a, base, 1); FFT(b, base, 1);
for(int i=0; i<base; i++) p[i] = a[i] * b[i]; FFT(p, base, -1);
for(int i=0; i < n + m + 1; i++) c[i] = p[i].real() / base + 0.1;
for(int i=0; i < n + m + 1; i++) printf("%d%c", c[i], i == n + m ? '\n' : ' ');
return 0;
}
Radix-2 Recursive-FFT
最新推荐文章于 2025-09-16 09:30:38 发布
本文深入探讨了Radix-2递归FFT算法,详细阐述了其工作原理和步骤,适用于高效计算复数序列的离散傅里叶变换。同时,该算法在多项式乘法中的应用也被提及,展示了FFT在数值计算领域的强大效能。

3万+

被折叠的 条评论
为什么被折叠?



