#include using namespace std; #define rep(i,n) for (int (i)=(0);(i)<(int)(n);++(i)) using ll = long long; using P = pair; template inline bool chmax(T& a, T b) {if (a < b){a = b;return 1;}return 0;} template inline bool chmin(T& a, T b) {if (a > b){a = b;return 1;}return 0;} const long long LLINF = 1LL << 60; using namespace std; // 負の数にも対応したmod // inline long long mod(long long a, long long m) { return (a % m + m) % m; } // ab + bq = gcd(a, b)となる(p, q)を求めて,d = gcd(a, b) をリターンする long long extgcd(long long a, long long b, long long& x, long long& y) { long long d = a; if (b != 0) { d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else { x = 1; y = 0; } return d; } // 中国剰余定理 // リターン値を(r, m)とすると解は x ≡ r (mod. m) // 解ナシの場合は(0, -1)をリターン // 2元 pair chineserem(long long b1, long long m1, long long b2, long long m2) { long long p, q; long long d = extgcd(m1, m2, p, q); if ((b2 - b1)%d != 0) return make_pair(0, -1); long long m = m1 * (m2/d); long long tmp = (b2 - b1) / d * p % (m2/d); long long r = mod(b1 + m1 * tmp, m); return make_pair(r, m); } pair chineserem(const vector &b, const vector &m) { long long r = 0, M = 1; for (int i = 0; i < b.size(); ++i) { long long p, q; long long d = extgcd(M, m[i], p, q); if ((b[i] - r) % d != 0) return make_pair(0, -1); long long tmp = (b[i] - r) / d * p % (m[i]/d); r += M * tmp; M *= m[i]/d; } return make_pair(mod(r, M), M); } // 逆元 // (a, m)が互いに素 long long modinv(long long a, long long m) { long long x, y; extgcd(a, m, x, y); return mod(x, m); } // mは互いに素でなければいけない long long garner(vector b, vector m, long long MOD) { m.push_back(MOD); vector coeffs((int)m.size(), 1); vector constants((int)m.size(), 0); for (int k = 0; k < b.size(); ++k) { long long t = mod((b[k] - constants[k]) * modinv(coeffs[k], m[k]), m[k]); for (int i = k+1; i &b, vector &m, long long MOD) { long long res = 1; for (int i = 0; i < b.size(); ++i) { for (int j = 0; j < i; ++j) { long long g = gcd(m[i], m[j]); if ((b[i] - b[j])% g != 0) return -1; m[i] /= g; m[j] /= g; long long gi = gcd(m[i], g), gj = g/gi; do { g = gcd(gi, gj); gi *= g; gj /= g; } while (g != 1); m[i] *= gi; m[j] *= gj; b[i] %= m[i]; b[j] %= m[j]; } } for (int i = 0; i < b.size(); ++i) (res *= m[i]) %= MOD; return res; } int main() { int N; cin >> N; vector x(N), y(N); bool nonzero = false; rep(i, N) { cin >> x[i] >> y[i]; if (x[i] > 0) nonzero = true; } ll lcm = pregarner(x, y, 1e9+7); if (!nonzero) cout << lcm << endl; else if (lcm == -1) cout << -1 << endl; else cout << garner(x, y, 1e9+7) << endl; }