// correct #include #include constexpr int M = 1000010; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; std::vector w(M + 1); for (int i = 0; i < n; ++i) { int a, b; std::cin >> a >> b; ++w[a + 1]; --w[b + 1]; if (const int d = a - b; d < 0) { --w[0]; --w[1]; ++w[-d]; } else { --w[d + 1]; } } // accumulate for (int i = 0; i < M; ++i) { w[i + 1] += w[i]; } // zeta transform { std::vector is_prime(M + 1, true); for (int p = 2; p <= M; ++p) { if (not is_prime[p]) continue; int q = M / p; for (; q >= p; --q) { is_prime[p * q] = false; w[q] += w[p * q]; } for (; q >= 1; --q) { w[q] += w[p * q]; } } } int max_f = -1, argmax = 0; for (int m = 1; m <= M; ++m) { const int f_m = 1LL * -n * (M / m) - w[0] - w[m]; if (f_m > max_f) { max_f = f_m; argmax = m; } } std::cout << argmax << '\n'; }