# (Python3/PyPy3): Compute xmin(D,A,B,K), return -1 if not exists # mwf(L,R,m,a,b,c,d) = max{a*x + b*floor(c*x + d) | x ∈ ℕ, L ≤ x < R} # Δ(D,A,B,x) = floor(x/D) - floor(floor(x/A) * floor(AB/D) / B) # xmin(D,A,B,K) = min{x ∈ ℕ | K < Δ(D,A,B,x)} def mwf(L: int, R: int, m: int, a: int, b: int, c: int, d: int) -> int: assert L < R and 0 < m n = R - L qd0, d = divmod(c * L + d, m) max_acc = sum_acc = a * L + b * qd0 while True: qc, c = divmod(c, m) a += b * qc qd, d = divmod(d, m) sum_acc += b * qd n -= 1 y_max = (c * n + d) // m max_acc = max(max_acc, sum_acc, sum_acc + a * n + b * y_max) if (a <= 0 and b <= 0) or (a >= 0 and b >= 0) or y_max == 0: return max_acc if a < 0: sum_acc += a + b n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1) def compute_xmin(D: int, A: int, B: int, K: int) -> int: import math assert D > 0 and A > 0 and B > 0 and K >= 0 gcd_DA = math.gcd(D, A) Dred, Ared, Tdelta = D // gcd_DA, A // gcd_DA, B * K Mred, Rred = divmod(Ared * B, Dred) if Rred == 0 and Dred * K + 1 >= Ared: return -1 lo, hi = 0, Ared * B * K + 2 while lo + 1 < hi: mid = (lo + hi) // 2 if mwf(lo, mid, Ared, B, -Mred, Dred, 0) <= Tdelta: lo = mid else: hi = mid return D * lo if __name__ == "__main__": import sys T = int(sys.stdin.readline()) for _ in range(T): D, A, B, K = map(int, sys.stdin.readline().split()) print(compute_xmin(D, A, B, K))