#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef pair P; typedef bitset<16> BS; struct edge { int to, cost, id; }; const ll MOD = 1E+09 + 7; // =998244353; const ll INF = 1E18; const int MAX_N = 3; ll dx[4] = { -1, 1, 0, 0 }, dy[4] = { 0, 0, -1, 1 }; ll extgcd(ll a, ll b, ll& x, ll& y); pair crt(ll b1, ll m1, ll b2, ll m2); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll r = 0, m = 1; bool all0 = true; for (int i = 1; i <= 3; i++) { ll x, y; cin >> x >> y; if (x != 0) all0 = false; auto p = crt(r, m, x, y); r = p.first, m = p.second; //cout << "r = " << r << ", m = " << m << "\n"; } /* for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << "i = " << i << ", j = " << j << ", dp = " << dp[i][j] << "\n"; } } */ if (m == -1) { cout << -1 << "\n"; } else if (!all0) { cout << r << "\n"; } else { cout << m << "\n"; } return 0; } // ax + by = gcd(a,b) を満たす(x,y)を求める ll extgcd(ll a, ll b, ll& x, ll& y) { if (b == 0) { x = 1; y = 0; return a; } ll d = extgcd(b, a % b, y, x); y -= (a / b) * x; return d; } //中国剰余定理 //x ≡ b1(mod.m1) かつ x ≡ b2(mod.m2) をみたすような x が存在するとき //x ≡ r(mod.lcm(m1, m2)) をみたすような r が lcm(m1, m2) 未満に一つだけ存在する。 //b1, m1, b2, m2 を入力として r と lcm(m1, m2) のペアを返す。 //ただし条件を満たす x が存在するのは b1 ≡ b2(mod.gcd(m1, m2)) の場合に限るため、 //解が存在しない場合には (0, -1) のペアを返す pair crt(ll b1, ll m1, ll b2, ll m2) { if (m1 < 0 || m2 < 0) return make_pair(0, -1); ll p, q; ll d = extgcd(m1, m2, p, q); if ((b2 - b1) % d != 0) return make_pair(0, -1); ll s = (b2 - b1) / d; ll m = m1 * m2 / d; //桁あふれ対策 ll _x = (s * p) % (m2 / d); ll x = b1 + m1 * _x; // x < 0 の可能性があるため x >= 0 を満たす最小の x を r とする ll r = (x % m + m) % m; return make_pair(r, m); }