Submission #7423586
Source Code Expand
#include <bits/stdc++.h> using namespace std::literals::string_literals; using i64 = long long; using std::cout; using std::endl; using std::cin; template<typename T> std::vector<T> make_v(size_t a){return std::vector<T>(a);} template<typename T,typename... Ts> auto make_v(size_t a,Ts... ts){ return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...)); } template<typename T> class polynomial { using value_type = T; using size_type = size_t; std::vector<value_type> data; public: polynomial() : data(1, 0) {} polynomial(const size_type & N) : data(N, 0) {} const value_type eval(const value_type & x) { value_type ret = data[0], tmp = x; for(int i = 1; i < data.size(); i++) { ret += data[i] * tmp; tmp *= x; } return ret; } void resize(const size_type & N) { data.resize(N); } value_type & operator[](const size_type & k) { return data[k]; } const size_type degree() { return data.size() - 1; } const size_type size() { return data.size(); } }; namespace fast_fourier_transform { using Real = double; using Complex = std::complex<Real>; using poly = polynomial<Complex>; const Real PI = M_PI; const poly DFT(poly f) { const int N = f.size(); if(N == 1) return f; poly f0(N / 2); poly f1(N / 2); for(int i = 0; i < f0.size(); i++) f0[i] = f[i << 1]; for(int i = 0; i < f1.size(); i++) f1[i] = f[i << 1 ^ 1]; poly inv_f0 = DFT(f0); poly inv_f1 = DFT(f1); poly inv_f(N); for(int i = 0; i < f.size(); i++) { Complex zeta_n_i = Complex(cos(2. * PI * i / N), sin(2. * PI * i / N)); inv_f[i] = inv_f0[i % f0.size()] + zeta_n_i * inv_f1[i % f1.size()]; } return inv_f; } const poly IDFT(poly inv_f) { const int N = inv_f.size(); poly arranged = DFT(inv_f); poly f(N); for(int i = 0; i < N; i++) f[i] = arranged[(N - i) % N] / Complex(N, 0); return f; } const poly convolution(poly a, poly b) { const int sz = a.size() + b.size() - 1; int N = 1; while(N < sz) N <<= 1; a.resize(N); b.resize(N); poly inv_a = DFT(a); poly inv_b = DFT(b); poly inv_c(N); for(int i = 0; i < N; i++) inv_c[i] = inv_a[i] * inv_b[i]; return IDFT(inv_c); } }; int main() { namespace FFT = fast_fourier_transform; using poly = FFT::poly; int n; scanf("%d", &n); poly a(n + 1), b(n + 1); for(int i = 1; i < n + 1; i++) std::cin >> a[i] >> b[i]; poly c = FFT::convolution(a, b); for(int i = 1; i < 2 * n + 1; i++) printf("%d\n", (int)std::round(c[i].real())); return 0; }
Submission Info
Submission Time | |
---|---|
Task | C - 高速フーリエ変換 |
User | ecasdqina |
Language | C++14 (GCC 5.4.1) |
Score | 100 |
Code Size | 2586 Byte |
Status | AC |
Exec Time | 1985 ms |
Memory | 48428 KB |
Compile Error
./Main.cpp: In function ‘int main()’: ./Main.cpp:99:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] int n; scanf("%d", &n); poly a(n + 1), b(n + 1); ^
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 100 / 100 | ||||
Status |
|
|
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 | 1 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 | 1 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 | 945 ms | 24352 KB |
02_01_82431 | AC | 1948 ms | 47948 KB |
02_02_17056 | AC | 448 ms | 12108 KB |
02_03_34866 | AC | 930 ms | 23836 KB |
02_04_6779 | AC | 107 ms | 3344 KB |
02_05_65534 | AC | 962 ms | 24820 KB |
02_06_65535 | AC | 962 ms | 24812 KB |
02_07_65536 | AC | 1932 ms | 47324 KB |
02_08_65537 | AC | 1935 ms | 47324 KB |
02_09_65538 | AC | 1944 ms | 47324 KB |
02_10_100000 | AC | 1985 ms | 48428 KB |