classBigInt { public: int len_; int arr_[10500]; BigInt(int x = 0) { memset(arr_, 0, sizeof(arr_)); for (len_ = 1; x; ++len_) arr_[len_] = x % 10, x /= 10; --len_; } int &operator[](int x) { return arr_[x]; } voidprint() { for (int i = max(1, len_); i >= 1; --i) { cout << arr_[i]; } } voidflatten(int len) { len_ = len; for (int i = 1; i <= len_; ++i) { if (arr_[i] >= 10) { arr_[i + 1] += arr_[i] / 10; arr_[i] %= 10; } } while (!arr_[len_]) --len_; } };
BigInt operator*(BigInt a, int b) { BigInt c; int len = a.len_; for (int i = 1; i <= len; ++i) { c[i] += a[i] * b; } c.flatten(len + 11); return c; }
boolgreater_eq(BigInt a, BigInt b, int lst_dg) { if (lst_dg <= 0) returnfalse; if (a[lst_dg + b.len_] != 0) returntrue; for (int i = b.len_; i >= 1; --i) { if (a[lst_dg + i - 1] > b[i]) returntrue; if (a[lst_dg + i - 1] < b[i]) returnfalse; } returntrue; }
BigInt operator/(BigInt a, int b) { BigInt c; longlong r = 0; for (int i = a.len_; i >= 1; --i) { c[i] += (r * 10 + a[i]) / b; r = (r * 10 + a[i]) % b; } c.flatten(a.len_); return c; }
structNode { int a_, b_; } arr[10005];
intmain() { int n; cin >> n; for (int i = 0; i <= n; ++i) cin >> arr[i].a_ >> arr[i].b_; sort(arr + 1, arr + 1 + n, [](Node a, Node b) -> bool { return (1ll * a.a_ * a.b_) < (1ll * b.a_ * b.b_); }); BigInt mul(arr[0].a_), ans, div; for (int i = 1; i <= n; ++i) { div = mul / arr[i].b_; if (!greater_eq(ans, div, ans.len_ - div.len_ + 1)) ans = div; mul = mul * arr[i].a_; } ans.print(); return0; }