#include using namespace std; #define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++) #define ll long long //1次元累積和 //全て0-indexedで処理 template struct CumulativeSum { int siz; vector S; bool done; CumulativeSum() : CumulativeSum(0) {} CumulativeSum(int N) : CumulativeSum(vector(N, 0)) {} //累積和の構築はしない CumulativeSum(vector A) { done = false; siz = (int)A.size(); S.resize(siz+1); S[0] = 0; for (int i = 0; i < siz; i++) { S[i+1] = A[i]; } } //累積 void build() { assert(!done); for (int i = 1; i <= siz; i++) { S[i] += S[i-1]; } done = true; } //加算(累積前のみ) T add(int idx, T a) { assert(!done); return S[idx+1] += a; } //代入(累積前のみ) T set(int idx, T a) { assert(!done); return S[idx+1] = a; } //取得(累積前、累積後両方とも可能だが、どちらを想定するかをexpected_doneで渡す) [[nodiscard]] T get(int idx, bool expected_done) { assert(expected_done == done); return S[idx+1]; } //区間和取得(累積後のみ) //半開区間で与える [[nodiscard]] T sum(int l, int r) { assert(done); l = max(l, 0); r = min(r, siz); return S[r]-S[l]; } }; int main() { int N; cin >> N; int M = 1'001'000; vector A(N), B(N), C(N); rep(i, 0, N) { cin >> A[i] >> B[i]; C[i] = A[i]-B[i]; } int K = 1'100'000; vector cntA(K), cntB(K), cntC(2*K); rep(i, 0, N) { cntA[A[i]]++; cntB[B[i]]++; cntC[C[i]+K]++; } CumulativeSum SA(cntA), SB(cntB), SC(cntC); SA.build(); SB.build(); SC.build(); vector score(M+1); // cout << "ok" << endl; for (int m = 1; m <= M; m++) { // score[m] = sum(floor(A[i]/m)) - sum(floor(C[i]/m)) - sum(floor(B[i]/m)) score[m] = 0; for (ll a = 0; a <= M/m; a++) { //floor(A/m) = a //ma <= A < m(a+1) score[m] += a * SA.sum(m*a, m*(a+1)); // cout << "a : " << a << endl; } // cout << "done : a" << endl; for (ll b = 0; b <= M/m; b++) { score[m] -= b * SB.sum(m*b, m*(b+1)); } // cout << "done : b" << endl; for (ll c = -(M+m-1)/m; c <= M/m; c++) { int l = c * m, r = (c+1) * m; score[m] -= c * SC.sum(l+K, r+K); } // cout<< "done : " << m << "\n"; } // cout << "ok" << endl; ll max_sc = 0; rep(i, 1, M+1) max_sc = max(max_sc, score[i]); // cout << max_sc << endl; rep(i, 1, M+1) { if (max_sc == score[i]) { cout << i << endl; return 0; } } }