1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <cmath> #include <cstdio> #define R register #define I inline using namespace std; const int N = 4.2e6; const double PI = acos(-1); int n, r[N]; struct C { double r, i; I C() { r = i = 0; } I C(R double x, R double y) { r = x; i = y; } I C operator+(R C &x) { return C(r + x.r, i + x.i); } I C operator-(R C &x) { return C(r - x.r, i - x.i); } I C operator*(R C &x) { return C(r * x.r - i * x.i, r * x.i + i * x.r); } I void operator+=(R C &x) { r += x.r; i += x.i; } I void operator*=(R C &x) { R double t = r; r = r * x.r - i * x.i; i = t * x.i + i * x.r; } } f[N], g[N]; I int in() { R char c = getchar(); while (c < '-') c = getchar(); return c & 15; } I void FFT(R C *a, R int op) { R C W, w, t, *a0, *a1; R 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) for (W = C(cos(PI / i), sin(PI / i) * op), j = 0; j < n; j += i << 1) 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; } int main() { R int m, i, l = 0; scanf("%d%d", &n, &m); for (i = 0; i <= n; ++i) f[i].r = in(); for (i = 0; i <= m; ++i) g[i].r = in(); 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); puts(""); return 0; }
|