#include using namespace std; const int N = 1010; int n; struct Person { int left, right; } person[N]; bool cmp(const Person &a, const Person &b) { return a.left * a.right < b.left * b.right; } //高精度乘法 vector mul(vector &A, int b) { vector C; int t = 0; for (int i = 0; i < A.size() || t; i++) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } //高精度除法 vector div(vector &A, int b, int &r) { vector C; r = 0; for (int i = A.size() - 1; i >= 0; i--) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } //获取两个vector中较大的那个 vector max_vec(vector a, vector b) { if (a.size() > b.size()) return a; if (a.size() < b.size()) return b; for (int i = a.size() - 1; i >= 0; i--) { if (a[i] > b[i]) return a; if (a[i] < b[i]) return b; } return a; } int main() { //优化输入 ios::sync_with_stdio(false); cin >> n; //输入 for (int i = 0; i <= n; i++) cin >> person[i].left >> person[i].right; //排序,国王不参加排序 sort(person + 1, person + n + 1, cmp); //连乘各放入国王 vector lcj; lcj.push_back(person[0].left); //结果 vector res; res.push_back(0);//在做高精度时,也需要进行一步初始化 for (int i = 1; i <= n; i++) { int r;//余数,本题中因为只需要下取整,所以余数无意义 res = max_vec(res, div(lcj, person[i].right, r)); lcj = mul(lcj, person[i].left); } //倒序输出高精度数组中的值 for (int i = res.size() - 1; i >= 0; i--) printf("%d", res[i]); return 0; }