from math import gcd INF = 10**2000 def mwf(n, m, a, b, c, d: int) -> int: def eval(m, a, b, c, d, x: int) -> int: return a * x + b * ((c * x + d) // m) ans = 0 param = (n, m, a, b, c, d) ops = [] def f(ans, param): n, m, a, b, c, d = param if n <= 0: ans = -INF return (True, ans, param) if c < 0 or d < 0: ops.append(("+", b * (d // m))) param = (n, m, a + b * (c // m), b, c % m, d % m) return (False, ans, param) if a >= 0 and b >= 0: ans = eval(m, a, b, c, d, n-1) return (True, ans, param) if a < 0 and b < 0: ans = eval(m, a, b, c, d, 0) return (True, ans, param) if m == 1: ans = max(eval(m, a, b, c, d, 0), eval(m, a, b, c, d, n-1)) return (True, ans, param) if c >= m: c1 = c // m c2 = c % m param = (n, m, a + b * c1, b, c2, d) return (False, ans, param) if d >= m: d1 = d // m d2 = d % m param = (n, m, a, b, c, d2) ops.append(("+", b * d1)) return (False, ans, param) k = (c * (n-1) + d) // m if a < 0: ops.append(("max", eval(m, a, b, c, d, 0))) ops.append(("+", b)) param = (k, c, b, a, m, m - d + c - 1) return (False, ans, param) ops.append(("max", eval(m, a, b, c, d, n-1))) param = (k, c, b, a, m, m - d - 1) return (False, ans, param) while True: b, ans, param = f(ans, param) if b: break for op, val in ops[::-1]: if op == "+": ans = ans + val else: ans = max(ans, val) # print(ans) return ans def solve(): d, a, b, k = map(int, input().split()) th = a * b * k * 2 + 4 ng = 0 ok = 1 m = (a * b) // d while ok < th and mwf(ok+1, a, b, -m, d, 0) <= b * k: ok *= 2 if ok >= th: print(-1) return while ok - ng > 1: mid = (ok + ng) // 2 if mwf(mid+1, a, b, -m, d, 0) <= b * k: ng = mid else: ok = mid print(ok * d) t = int(input()) for _ in range(t): solve()