Submission #7577531


Source Code Expand

#include <iostream>
#include <cmath>
#include <vector>
#include <complex>

using Real = long double;
using std::vector;
using std::complex;
using Complex = complex<Real>;

const Real PI = std::acos(-1);

vector<Complex> dft(vector<Complex> f, bool isinv) {
    int n = f.size();
    if (n == 1) return f;
    vector<vector<Complex>> ff(2, vector<Complex>(n / 2));
    for (int i = 0; i < n; ++i) {
        ff[i & 1][i >> 1] = f[i];
    }
    for (auto& v : ff) v = dft(v, isinv);

    Complex zeta = std::polar(1.0l, 2 * PI / n);
    if (isinv) zeta = conj(zeta);

    Complex powzeta = 1;
    for (int i = 0; i < n; ++i) {
        f[i] = ff[0][i % (n / 2)] + powzeta * ff[1][i % (n / 2)];
        powzeta *= zeta;
    }
    return f;
}

vector<Complex> mult(vector<Complex> g, vector<Complex> h) {
    int n = 1;
    while (n < g.size() + h.size() + 1) n <<= 1;
    g.resize(n, 0), h.resize(n, 0);

    vector<Complex> gg = dft(g, false), hh = dft(h, false);
    vector<Complex> ff(n);
    for (int i = 0; i < n; ++i) ff[i] = gg[i] * hh[i];

    vector<Complex> f = dft(ff, true);
    for (auto& x : f) x /= n;
    return f;
}

int main() {
    int n;
    std::cin >> n;
    vector<Complex> a(n + 1), b(n + 1);
    a[0] = b[0] = 0;
    for (int i = 1; i <= n; ++i) {
        Real x;
        std::cin >> x;
        a[i] = x;
        std::cin >> x;
        b[i] = x;
    }

    auto ans = mult(a, b);
    for (int i = 1; i <= 2 * n; ++i) {
        std::cout << static_cast<int>(std::round(ans[i].real())) << std::endl;
    }
    return 0;
}

Submission Info

Submission Time
Task C - 高速フーリエ変換
User Tiramister
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1605 Byte
Status AC
Exec Time 1782 ms
Memory 80244 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 33
Set Name Test Cases
Sample 00_sample_01
All 00_sample_01, 01_00_01, 01_01_19, 01_02_31, 01_03_22, 01_04_31, 01_05_40, 01_06_15, 01_07_39, 01_08_28, 01_09_30, 01_10_23, 01_11_33, 01_12_11, 01_13_28, 01_14_41, 01_15_26, 01_16_49, 01_17_34, 01_18_02, 01_19_33, 01_20_29, 02_00_51254, 02_01_82431, 02_02_17056, 02_03_34866, 02_04_6779, 02_05_65534, 02_06_65535, 02_07_65536, 02_08_65537, 02_09_65538, 02_10_100000
Case Name Status Exec Time Memory
00_sample_01 AC 1 ms 256 KB
01_00_01 AC 1 ms 256 KB
01_01_19 AC 2 ms 256 KB
01_02_31 AC 2 ms 256 KB
01_03_22 AC 2 ms 256 KB
01_04_31 AC 2 ms 256 KB
01_05_40 AC 2 ms 256 KB
01_06_15 AC 2 ms 256 KB
01_07_39 AC 2 ms 256 KB
01_08_28 AC 2 ms 256 KB
01_09_30 AC 2 ms 256 KB
01_10_23 AC 2 ms 256 KB
01_11_33 AC 2 ms 256 KB
01_12_11 AC 2 ms 256 KB
01_13_28 AC 2 ms 256 KB
01_14_41 AC 2 ms 256 KB
01_15_26 AC 2 ms 256 KB
01_16_49 AC 2 ms 256 KB
01_17_34 AC 2 ms 256 KB
01_18_02 AC 1 ms 256 KB
01_19_33 AC 2 ms 256 KB
01_20_29 AC 2 ms 256 KB
02_00_51254 AC 877 ms 40284 KB
02_01_82431 AC 1735 ms 79164 KB
02_02_17056 AC 392 ms 19764 KB
02_03_34866 AC 815 ms 39260 KB
02_04_6779 AC 101 ms 5308 KB
02_05_65534 AC 930 ms 41188 KB
02_06_65535 AC 1672 ms 78044 KB
02_07_65536 AC 1684 ms 78044 KB
02_08_65537 AC 1692 ms 78168 KB
02_09_65538 AC 1679 ms 78172 KB
02_10_100000 AC 1782 ms 80244 KB