#include #include #include #include #include #include #include #include #include #include static double time_func(std::function func) { const double minmeasure = 2.0; const double factor = 1.5; for (int reps = 1; reps < INT_MAX / factor; reps = std::max(reps + 1, reps * factor)) { const clock_t t_start = clock(); for (int k = 0; k < reps; k++) func(); const clock_t t_end = clock(); const double time_taken = (double)(t_end - t_start) / CLOCKS_PER_SEC; std::cerr << reps << "x -> " << time_taken << "s" << std::endl; if (time_taken >= minmeasure) return time_taken / reps; } assert(false); } static std::string read_input() { std::ios::sync_with_stdio(false); std::ifstream file{"1.in"}; file.seekg(0, std::ios::end); size_t filesize = file.tellg(); file.seekg(0); std::string input(filesize, '\0'); size_t cursor = 0; while (cursor < filesize) { file.read(&input[cursor], filesize - cursor); cursor += file.gcount(); } return input; } static std::pair solve(const std::string &input) { std::vector numbers; numbers.reserve(input.size() / 2); std::bitset<2021> have; char *endp = nullptr; const char *cursor = input.data(); while (true) { int val = strtol(cursor, &endp, 10); if (endp == cursor) break; numbers.push_back(val); have[val] = true; cursor = endp; } int ans1 = -1; for (int n : numbers) { if (2020 - n >= 0 && have[2020 - n]) { ans1 = n * (2020 - n); break; } } for (int n : numbers) { for (int m : numbers) { const int k = 2020 - (n + m); if (k >= 0 && have[k]) { return std::make_pair(ans1, n * m * k); } } } assert(false); } int main() { const std::string input = read_input(); auto out = solve(input); std::cout << out.first << '\n' << out.second << std::endl; std::cout << time_func([&input](){ solve(input); }) << std::endl; }