#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math,link-pipe-args,inline") //#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") #include using namespace std; short int mul[40]; string operator*(string a, string b) { signed char n = a.size(), m = b.size(), cnt = n + m; memset(mul, 0, sizeof(mul)); for (signed char i = 0; i < n; i++) for (signed char j = 0; j < m; j++) mul[i + j] += (a[i] - '0') * (b[j] - '0'); for (signed char i = 0; i < cnt; i++) { mul[i + 1] += mul[i] / 10; mul[i] %= 10; } while (!mul[cnt]) cnt--; string res = ""; for (signed char i = cnt; i >= 0; i--) res += mul[i] + '0'; return res; } string a, b, c, d; struct pair_hash { template std::size_t operator () (const std::pair &p) const { auto h1 = std::hash{}(p.first); auto h2 = std::hash{}(p.second); return h1 ^ (h2 + 0x9e3779b97f4a7c16 + (h1<<6) + (h1>>2)); } }; unordered_map, string, pair_hash> s; void generate(string& a, unordered_map, string, pair_hash>& s, string& d) { int n = a.length(); for (int i = 1; i < (1<, string, pair_hash>& s, string& d) { int n = a.length(); for (int i = 1; i < (1<> a >> b >> c >> d; // reverse all the numbers beforehand to speed up multiplication reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); reverse(c.begin(), c.end()); reverse(d.begin(), d.end()); generate(a, s, d); generate_and_find(b, s, c); cout << "impossible\n"; }