#include <bits/stdc++.h> using namespace std; #define For(i, a, b) for(int i = (a); i < (b); i++) #define rep(i, n) For(i, 0, n) #define rFor(i, a, b) for(int i = (a); i >= (b); i--) #define ALL(v) (v).begin(), (v).end() #define rALL(v) (v).rbegin(), (v).rend() using lint = long long; using ld = long double; int INF = 2000000000; lint LINF = 1000000000000000000; struct SetupIo { SetupIo() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); } } setupio; template <class T> T bin_gcd(T a_, T b_) { unsigned long long a = abs(a_), b = abs(b_); if (a == 0 || b == 0) { return (a == 0 ? b : a); } int x = __builtin_ctzll(a), y = __builtin_ctzll(b); a >>= x; b >>= y; while (a != b) { if (a < b) { swap(a, b); } a -= b; a >>= __builtin_ctzll(a); } return (a << min(x, y)); } // ax + by = gcd(a, b) を満たす (x, y) を求める // c が gcd(a, b) で割り切れないと、ax + by = c を満たす c は存在しない // 負の数の場合の処理に注意 long long extGCD(long long a, long long b, long long &x, long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long d = extGCD(b, a % b, y, x); y -= a / b * x; return d; } template <class T> T div_floor(T a, T b) { assert(b != 0); if (b < 0) { a = -a; b = -b; } return (a >= 0 ? a / b : (a + 1) / b - 1); } template <class T> T div_ceil(T a, T b) { assert(b != 0); if (b < 0) { a = -a; b = -b; } return (a > 0 ? (a - 1) / b + 1 : a / b); } const lint mod = 1000000000; int main() { int TT; cin >> TT; while (TT--) { lint n, m; cin >> n >> m; lint g = bin_gcd(mod, n); if (m % g != 0) { cout << -1 << "\n"; continue; } lint x, y; extGCD(mod, -n, x, y); if (mod * x - n * y == -g) { x = -x; y = -y; } x *= (m / g); y *= (m / g); lint add = mod / g; lint p = div_ceil<lint>(-y, add); y += p * add; cout << y << "\n"; } }