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
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 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