#include using namespace std; long long mod_inv(long long a, long long mod) { if (mod == 1) return 0; a %= mod; long long b = mod, s = 1, t = 0; while (1) { if (a == 1) return s; t -= (b / a) * s; b %= a; if (b == 1) return t + mod; s -= (a / b) * t; a %= b; } } pair extgcd(long long a, long long b) { long long s = a, t = b; long long xs = 1, ys = 0, xt = 0, yt = 1; while (t > 0) { long long u = s / t; s -= t * u; xs -= xt * u; ys -= yt * u; swap(s, t); swap(xs, xt), swap(ys, yt); } return {xs, ys}; } pair garner(vector Rem, vector Mod) { assert (Rem.size() == Mod.size()); int n = int(Mod.size()); // garner long long x = 0, prod = 1; for (int i = 0; i < n; i++) { if (Mod[i] == 1) continue; long long g = gcd(prod, Mod[i]); long long c = (Rem[i] + (Mod[i] - x % Mod[i])) % Mod[i]; if (c % g) return {-1, -1}; // not exist long long m = Mod[i] / g; c = (c / g) * mod_inv((prod / g) % m, m) % m; x = x + c * prod; prod *= m; x %= prod; } return {x, prod}; } long long garner2(vector Rem, vector Mod, long long mod) { assert (Rem.size() == Mod.size()); int n = int(Mod.size()); // garner vector C(n); for (int i = 0; i < n; i++) { long long x = 0, prod = 1; for (int j = 0; j < i; j++) { x = (x + C[j] * prod % Mod[i]) % Mod[i]; prod = (prod * Mod[j]) % Mod[i]; } long long g = gcd(prod, Mod[i]); long long c = (Rem[i] + (Mod[i] - x)) % Mod[i]; if (c % g) return -1; // not exist long long m = Mod[i] / g; c = (c / g) * mod_inv((prod / g) % m, m) % m; Mod[i] /= g, C[i] = c; } long long ans = 0; for (int i = n - 1; i >= 0; i--) ans = ((ans * Mod[i]) % mod + C[i]) % mod; return ans; } void solve() { int N; cin >> N; vector X, Y; for (int i = 0; i < N; i++) { long long x, y; cin >> x >> y; X.push_back(x), Y.push_back(y); } cout << garner2(X, Y, 1000000007) << endl; } int main() { int T = 1; //cin >> T; for (int t = 0; t < T; t++) solve(); }