Submission #2628595
Source Code Expand
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(var,n) for(int var=0;var<(n);++var) #define rep1(var,n) for(int var=1;var<=(n);++var) typedef complex<double> Cdbl; template<typename T> inline void bit_reverse(vector<T>& a) { int n = a.size(); int i = 0; for (int j=1; j<n-1; ++j) { for (int k = n >> 1; k >(i ^= k); k >>= 1); if (j < i) swap(a[i], a[j]); } } void dft(vector<Cdbl>& a, int sign=1){ // in-place const int n = a.size(); assert((n ^ (n&-n)) == 0); //n = 2^k bit_reverse(a); for (int m=1; m<n; m<<=1) { const int m2 = 2 * m; // long long _base = mod_pow(h.val, n/m2, mod); double th = sign * M_PI * 2 / m2; // n * (n/m2); //(n/m2); //(n/m); // double th = sign * M_PI * 2 / (n/m2); //(n/m2); //(n/m); Cdbl _base(cos(th), sin(th)); // = mod_pow(h, n/m2, mod); Cdbl _w(1, 0); for (int x=0; x<m; ++x) { for (int s=x; s<n; s+=m2) { Cdbl u = a[s]; Cdbl d = _w * a[s + m]; a[s] = u+d; a[s+m] = u-d; } _w *= _base; } } } inline void idft(vector<Cdbl>& f) { dft(f, -1); int n = f.size(); rep(i, n) f[i] /= n; } vector<Cdbl> convolution_dft(vector<Cdbl>& g, vector<Cdbl>& h) { int result_size = g.size() + h.size() - 1; int n = 1; while (n < result_size) n <<= 1; g.resize(n, 0); h.resize(n, 0); dft(g); dft(h); vector<Cdbl> f(n, 0); for (int i=0; i<n; ++i) f[i] = g[i] * h[i]; idft(f); f.resize(result_size); return f; } vector<ll> convolution_dft_ll(vector<ll>& g, vector<ll>& h) { vector<Cdbl> _g(g.size()), _h(h.size()); rep(i, g.size()) _g[i] = g[i]; rep(i, h.size()) _h[i] = h[i]; vector<Cdbl> _f = convolution_dft(_g, _h); vector<ll> f(_f.size()); rep(i, _f.size()) f[i] = (ll)round(_f[i].real()); return f; } int main() { int N; cin >> N; // 1-100000 vector<ll> g(N+1), h(N+1); g[0] = h[0] = 0; rep(i,N){ int A,B; cin >> A >> B; g[1+i] = A; h[1+i] = B; } vector<ll> f = convolution_dft_ll(g, h); rep1(k, N*2){ cout << f[k] << endl; } return 0; }
Submission Info
Submission Time | |
---|---|
Task | C - 高速フーリエ変換 |
User | naoya_t |
Language | C++14 (GCC 5.4.1) |
Score | 100 |
Code Size | 2285 Byte |
Status | AC |
Exec Time | 441 ms |
Memory | 15688 KB |
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 | 1 ms | 256 KB |
01_02_31 | AC | 1 ms | 256 KB |
01_03_22 | AC | 1 ms | 256 KB |
01_04_31 | AC | 1 ms | 256 KB |
01_05_40 | AC | 1 ms | 256 KB |
01_06_15 | AC | 1 ms | 256 KB |
01_07_39 | AC | 1 ms | 256 KB |
01_08_28 | AC | 1 ms | 256 KB |
01_09_30 | AC | 1 ms | 256 KB |
01_10_23 | AC | 1 ms | 256 KB |
01_11_33 | AC | 1 ms | 256 KB |
01_12_11 | AC | 1 ms | 256 KB |
01_13_28 | AC | 1 ms | 256 KB |
01_14_41 | AC | 1 ms | 256 KB |
01_15_26 | AC | 1 ms | 256 KB |
01_16_49 | AC | 1 ms | 256 KB |
01_17_34 | AC | 1 ms | 256 KB |
01_18_02 | AC | 1 ms | 256 KB |
01_19_33 | AC | 1 ms | 256 KB |
01_20_29 | AC | 1 ms | 256 KB |
02_00_51254 | AC | 224 ms | 7992 KB |
02_01_82431 | AC | 379 ms | 15080 KB |
02_02_17056 | AC | 82 ms | 3816 KB |
02_03_34866 | AC | 168 ms | 7480 KB |
02_04_6779 | AC | 29 ms | 1196 KB |
02_05_65534 | AC | 278 ms | 8448 KB |
02_06_65535 | AC | 272 ms | 8440 KB |
02_07_65536 | AC | 321 ms | 14584 KB |
02_08_65537 | AC | 324 ms | 14584 KB |
02_09_65538 | AC | 322 ms | 14584 KB |
02_10_100000 | AC | 441 ms | 15688 KB |