#include using namespace std; using ll = long long; using ld = long double; template using v = vector; template using vv = vector>; template using vvv = vector>>; #define rep(...) overload_rep(__VA_ARGS__, rep3, rep2)(__VA_ARGS__) #define overload_rep(_1, _2, _3, name, ...) name #define rep2(i, n) for (int i = 0; i < (int)(n); i++) #define rep3(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i,n) for(int i=(int)(n)-1;i>=0;i--) #define all(x) (x).begin(), (x).end() #define vi vector #define vll vector #define vvi vector> #define vvll vector> #define vvvi vector>> #define pii pair #define pll pair #define el '\n' #define sp ' ' #define Yes cout<<"Yes"< bool chmin(T &a, const T &b){ if (b < a){ a = b; return true; } return false; } template bool chmax(T &a, const T &b){ if (b > a){ a = b; return true; } return false; } using mtup = tuple; const int INF = 1e9; const long long LINF = 1e18; //const int mod = 998244353; const int mod = 1e9 + 7; ll extgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll x1, y1; ll g = extgcd(b, a % b, x1, y1); x = y1; y = x1 - (a / b) * y1; return g; } ll mod_inv(ll a, ll mod) { ll x, y; extgcd(a, mod, x, y); x %= mod; if (x < 0) x += mod; return x; } //解が大きくなりmodで割った余りを出力するとき // x % mi = ai をすべて満たす最小の x % modを返す int CRT(vector& a, vector&m, int mod){ int n = a.size(), x = 0; int Mmod = 1; for(int i = 0; i < n; ++i){ int Mi = 1; for(int j = 0; j < i; ++j){ Mi = (long long)Mi * m[j] % m[i]; } int c = (long long)(a[i] - x) * mod_inv(Mi, m[i]) % m[i]; x = (x + (long long)c * Mmod % mod) % mod; Mmod = (long long) Mmod * m[i] % mod; } return (x + mod) % mod; } //1つの素因数分解 vector fact(ll n){ vector res; for(int i = 2; (ll)i * i <= n;){ if(n % i == 0){ res.push_back(i); n /= i; continue; } ++i; } if(n > 1) res.push_back(n); return res; } //a^x mod(p) int mod_pow(ll a, ll x){ a %= mod; if(a == 0){ if(x == 0) return 1; return 0; } int res = 1; while(x){ if(x & 1){ res = res * a % mod; } a = a * a % mod; x >>= 1; } return res; } int main(){ //高速化 //ここから int n; cin >> n; vi x(n), y(n); rep(i, n) cin >> x[i] >> y[i]; map mp; rep(i, n){ auto a = fact(y[i]); sort(all(a)); a.push_back(-1); int mod = 1; rep(j, a.size() - 1){ mod *= a[j]; if(a[j] != a[j + 1]){ if(mp.count(a[j])){ auto [r, oldmod] = mp[a[j]]; int p = min(mod, oldmod); if(r % p != x[i] % p){ cout << -1 << el; return 0; }else if(mod > oldmod){ mp[a[j]] = {x[i], mod}; } }else{ mp[a[j]] = {x[i], mod}; } mod = 1; } } } vi a, md; for(auto [key, vl]:mp){ a.push_back(vl.first % vl.second); md.push_back(vl.second); } cout << CRT(a, md, mod) << el; } /* cppt cppt_ge seg, bit, uf g++ main.cpp -O2 -std=c++17 ./a.out */