#include<bits/stdc++.h> usingnamespace std; constdouble PI = acos(-1); int n, r[8000010]; structC// 复数类 { double r, i; C() { r = i = 0; } C(double x, double y) { r = x; i = y; } C operator+(C &x) { returnC(r + x.r, i + x.i); } C operator-(C &x) { returnC(r - x.r, i - x.i); } C operator*(C &x) { returnC(r * x.r - i * x.i, r * x.i + i * x.r); } voidoperator+=(C &x) { r += x.r; i += x.i; } voidoperator*=(C &x) { double t = r; r = r * x.r - i * x.i; i = t * x.i + i * x.r; } } f[8000010], g[8000010]; voidFFT(C *a, int op)// FFT { C W, w, t, *a0, *a1; int i, j, k; for (i = 0; i < n; i++) // 位逆序置换 if (i < r[i]) { t = a[i]; a[i] = a[r[i]]; a[r[i]] = t; } for (i = 1; i < n; i <<= 1) // 循环 log n 层进行蝴蝶操作 for (W = C(cos(PI / i), sin(PI / i) * op), j = 0; j < n; j += i << 1) // 这里的 *op 是运算和逆运算,上文提到过 DFT 和 IDFT 的 // 差别其实在于乘的是 \omega_n 还是 \omega_n^{-1}, // 最后的乘上 1/n 在输出的时候解决,于是就可以一个函数实现 // DFT和IDFT。 for (w = C(1, 0), a1 = i + (a0 = a + j), k = 0; k < i; k++, a0++, a1++, w *= W) { t = *a1 * w; *a1 = *a0 - t; *a0 += t; } } intmain() { ios::sync_with_stdio(0); int m, i, l = 0; cin >> n >> m; for (i = 0; i <= n; i++) cin >> f[i].r; for (i = 0; i <= m; i++) cin >> g[i].r; for (m += n, n = 1; n <= m; n <<= 1, l++) ; for (i = 0; i < n; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); // 位逆序置换的预处理 FFT(f, 1); FFT(g, 1); for (i = 0; i < n; i++) f[i] *= g[i]; // 点值相乘 FFT(f, -1); for (i = 0; i <= m; i++) printf("%.0f ", fabs(f[i].r) / n); }