#include <cmath>
#include <cstdio>
#include <cstring>
typedef struct complex
{
double a, b;
complex(double x = 0, double y = 0)
{
a = x, b = y;
}
complex operator + (const complex &t) const
{
return complex(a + t.a, b + t.b);
}
complex operator - (const complex &t) const
{
return complex(a - t.a, b - t.b);
}
complex operator * (const complex &t) const
{
return complex(a * t.a - b * t.b, a * t.b + b * t.a);
}
} cp;
const int N = 400005;
const double pi = 2 * acos(-1);
int n, m;
cp a[N], b[N];
void FFT(cp a[], int n, int f)
{
if (n == 1) return;
static cp t[N];
int m = n >> 1;
for (int i = 0; i < m; i ++ )
t[i] = a[i << 1],
t[i + m] = a[i << 1 | 1];
// 将 t 复制到 a 中
// 这里偷个懒,就直接用 memcpy 了
// 一个 double 占 8 个字节
// complex 有两个 double,占了 16 个字节
// 所以这里要将 n 乘 16
memcpy(a, t, n << 4);
// 然后对 a 做剩下的 FFT
FFT(a, m, f);
FFT(a + m, m, f);
for (int i = 0, j = m; i < m; i ++ , j ++ )
{
cp x(cos(pi * i / n), f * sin(pi * i / n));
t[i] = a[i] + x * a[j]; // 这里要改成从 a 到 t 做
t[j] = a[i] - x * a[j];
}
// 然后再将 t 复制回 a
memcpy(a, t, n << 4);
}
int main()
{
scanf("%d %d", &n, &m);
for (int i = 0; i <= n; i ++ )
{
double x;
scanf("%lf", &x);
a[i] = {x, 0};
}
for (int i = 0; i <= m; i ++ )
{
double x;
scanf("%lf", &x);
b[i] = {x, 0};
}
int k = 1;
while(k <= n + m) k *= 2;
FFT(a, k, 1);
FFT(b, k, 1);
for (int i = 0; i < k; i ++ ) a[i] = a[i] * b[i];
FFT(a, k, -1);
for (int i = 0; i <= n + m; i ++ )
printf("%d ", (int)(a[i].a / k + 0.5));
return 0;
}
AcWing 3122.多项式乘法(FFT)
最新推荐文章于 2024-07-24 08:30:00 发布