1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
   | #include<iostream> 
#include<string> 
#include<algorithm> 
using namespace std; 
int n; 
struct bigInt { //For Non-negative Numbers 
private: 
    string v; 
    static string & bIsort(string & v) { //each char has reduced '0' 
        for (int i = 0; i < v.length(); i++) { 
            if (v[i] > 9) { 
                if (i == v.length() - 1)v.append(1, v[i] / 10); 
                else v[i + 1] += v[i] / 10; 
                v[i] %= 10; 
            } 
        } 
        return v; 
    } 
    static string lng2str(long long v) { 
        string s = ""; 
        while (v) { 
            s.append(1, v % 10 + '0'); 
            v /= 10; 
        } 
        reverse(s.begin(), s.end()); 
        return s; 
    } 
    static string& trimPre0(string& v3) { 
        while (v3.length() != 0 && (*v3.begin()) == '0')v3.erase(v3.begin()); 
        if (v3.length() == 0)v3 = "0"; 
        return v3; 
    } 
public: 
    bigInt() { 
        v = "0"; 
    } 
    bigInt(long long n) { 
        v = lng2str(n); 
    } 
    bigInt(string s) { 
        v = s; 
    } 
    bigInt& operator = (const bigInt & bI) { 
        this->v = bI.v; 
        return *this; 
    } 
    bigInt operator * (bigInt bI2) const { 
        string v1 = v, v2 = bI2.v; 
        if (v2.length() > v1.length())swap(v1, v2); 
        reverse(v1.begin(), v1.end()); 
        reverse(v2.begin(), v2.end()); 
        string v3 = ""; 
        for (int i = 0; i < v1.length(); i++)v1[i] -= '0'; 
        for (int i = 0; i < v2.length(); i++)v2[i] -= '0'; 
        v3.resize(v1.length() + v2.length(), 0); 
        for (int i = 0; i < v2.length(); i++) { 
            for (int j = 0; j < v1.length(); j++) { 
                v3[i + j] += v2[i] * v1[j]; 
            } 
            bIsort(v3); 
        } 
        for (int i = 0; i < v3.length(); i++)v3[i] += '0'; 
        reverse(v3.begin(), v3.end()); 
        trimPre0(v3); 
        return bigInt(v3); 
    } 
    bigInt operator / (long long bI2) const { 
        string v1 = v; 
        for (int i = 0; i < v1.length(); i++)v1[i] -= '0'; 
        long long v2 = bI2; 
        string v3 = ""; 
        long long div = 0; 
        for (int i = 0; i < v1.length(); i++) { 
            div *= 10; 
            div += v1[i]; 
            if (div < v2) { 
                v3.append(1, '0'); 
                continue; 
            } 
            v3.append(lng2str(div / v2)); 
            div %= v2; 
        } 
        return bigInt(trimPre0(v3)); 
    } 
    bool operator < (bigInt bI2) const { 
        if (v.length() != bI2.v.length())return v.length() < bI2.v.length(); 
        for (int i = 0; i < v.length(); i++) { 
            if (v[i] != bI2.v[i])return v[i] < bI2.v[i]; 
        } 
        return false; 
    } 
    friend istream& operator >> (istream& in, bigInt& bI) { 
        in >> bI.v; 
        return in; 
    } 
    friend ostream& operator << (ostream& out, bigInt& bI) { 
        out << bI.v; 
        return out; 
    } 
}; 
struct p { 
    bigInt a; 
    int b; 
    bool operator < (const p& p2) { 
        return a * b < p2.a*p2.b; 
    } 
}ps[1005]; 
 
int main() { 
    cin >> n; 
    for (int i = 1; i <= n + 1; i++) { 
        cin >> ps[i].a >> ps[i].b; 
    } 
    sort(ps + 2, ps + n + 2); 
    bigInt multiply = ps[1].a; 
    bigInt mmax("0"); 
    for (int i = 2; i <= n + 1; i++) { 
        mmax = max(mmax, multiply / ps[i].b); 
        multiply =multiply* ps[i].a; 
    } 
    cout << mmax; 
}  |