#include <bits/stdc++.h>
using namespace std;
#define REP(i, a, b) for (register int i = (a), _end_ = (b); i <= _end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int dmax = 300100, oo = 0x3f3f3f3f;
const double PI = acos(-1);
int N, M, n, c[dmax];
complex<double> a[dmax], b[dmax], p[dmax];
inline int read()
{
int x = 0, f = 1, c = getchar();
while(c < '0' || c > '9')
{
if (c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') x = x * 10 + c -'0', c = 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 main()
{
scanf("%d%d", &N, &M);
REP(i, 0, N) a[i] = read();
REP(i, 0, M) b[i] = read();
for (int x = max(N, M) + 1, i = 1; i >> 2 < x; i <<= 1) n = i;
FFT(a, n, 1), FFT(b, n, 1);
REP(i, 0, n - 1) p[i] = a[i] * b[i];
FFT(p, n, -1);
REP(i, 0, N + M) c[i] = p[i].real() / n + 0.1;
REP(i, 0, N + M) printf("%d%c", c[i], i == N + M ? '\n' : ' ');
return 0;
}
Radix-2 分治FFT
最新推荐文章于 2024-08-29 09:21:33 发布