#include using namespace std; typedef long long int ll; typedef pair pii; typedef vector vi; typedef vector > vii; #define rrep(i, m, n) for(int (i)=(m); (i)<(n); (i)++) #define erep(i, m, n) for(int (i)=(m); (i)<=(n); (i)++) #define rep(i, n) for(int (i)=0; (i)<(n); (i)++) #define rrev(i, m, n) for(int (i)=(n)-1; (i)>=(m); (i)--) #define erev(i, m, n) for(int (i)=(n); (i)>=(m); (i)--) #define rev(i, n) for(int (i)=(n)-1; (i)>=0; (i)--) #define vrep(i, c) for(__typeof((c).begin())i=(c).begin(); i!=(c).end(); i++) #define ALL(v) (v).begin(), (v).end() #define mp make_pair #define pb push_back template inline bool minup(T& m, S x){ return m>(T)x ? (m=(T)x, true) : false; } template inline bool maxup(T& m, S x){ return m<(T)x ? (m=(T)x, true) : false; } const int INF = 1000000000; const ll MOD = 1000000007LL; const double EPS = 1E-12; template T gcd(T a, T b) { T tmp; while(b){ tmp = a; a = b; b = tmp%b; } return a; } template inline T lcm(T a, T b){ return a * (b / gcd(a, b)); } template T extgcd(T a, T b, T& x, T& y) { T d = a; if(b != (T)0){ d = extgcd(b, a % b, y, x); y -= (a / b) * x; } else{ x = (T)1; y = (T)0; } return d; } template T modInverse(T a, T m) { T x, y; extgcd(a, m, x, y); return (m + x % m) % m; } template pair linearCongruence(const vector& A, const vector& B, const vector& M) { T x = (T)0; T m = (T)1; rep(i, A.size()){ T a = A[i] * m; T b = B[i] - A[i] * x; T d = gcd(M[i], a); if(b % d) return mp((T)-1, (T)-1); T t = b / d * modInverse(a / d, M[i] / d) % (M[i] / d); x = x + m * t; m *= M[i] / d; } return mp((x + m) % m, m); } int N; ll x, y; vector A, B, M; int main() { cin >> N; rep(i, N){ cin >> x >> y; A.pb(1LL); B.pb(x); M.pb(y); } cout << linearCongruence(A, B, M).first % MOD << endl; return 0; }