INF = 10**100; IDEN = (0, -INF); def mul(a, b): return (a[0] + b[0], max(a[1], a[0] + b[1])); def power(a, e): if (e == 0): return IDEN; if (a[0] > 0): return (e * a[0], (e - 1) * a[0] + a[1]); return (e * a[0], a[1]); # y^f(0) x y^(f(1)-f(0)) x y^(f(2)-f(1)) x ... x y^(f(n)-f(n-1)) # where f(i) = floor((a i + b) / m) def pathUnder(m, a, b, n, e, x, y): c = (a * n + b) // m; pre = e; suf = e; while True: p = a // m; a %= m; x = mul(x, power(y, p)); q = b // m; b %= m; pre = mul(pre, power(y, q)); c -= (p * n + q); if (c == 0): return mul(mul(pre, power(x, n)), suf); d = (m * c - b - 1) // a + 1; suf = mul(mul(y, power(x, n - d)), suf); b = m - b - 1 + a; m, a = a, m; n = c - 1; c = d; x, y = y, x; numCases = int(input()); for caseId in range(numCases): D, A, B, K = [int(_) for _ in input().split()]; P = A * B // D; Q = B; def check(n): sm, mx = pathUnder(A, D, 0, n, IDEN, (Q, 0), (-P, -INF)); return (mx > Q * K); lo = 0; hi = A * (Q * K + 1); if (check(hi)): while (lo + 1 < hi): mid = (lo + hi) // 2; if (check(mid)): hi = mid; else: lo = mid; print(D * lo); else: print(-1);