from math import gcd def floor_sum(n, m, a, b): ans = 0 while True: if a < 0 or a >= m: k = a // m a = a % m if a < 0: a += m k -= 1 ans += k * n * (n - 1) // 2 if b < 0 or b >= m: k = b // m b = b % m if b < 0: b += m k -= 1 ans += k * n y_max = (a * n + b) // m if y_max == 0: break x_max = y_max * m - b ans += (n - (x_max + a - 1) // a) * y_max n, m, a, b = y_max, a, m, (a - x_max % a) % a return ans def ceil_div(p, q): return (p - 1) // q + 1 def solve(d, a, b, k): k += 1 # y=floor((ax+a-1)/d) # y=floor(ex/b) e = a * b // d def get_min_x(c): # y=(ax+c)/d # y=ex/b # a/d == e/b if c // d >= k: return 0 # print(a, d, e, b, c) if a * b == e * d: if c // d + (c % d >= gcd(a, d)) < k: return -1 x_from = 0 else: x_from = max(0, ceil_div(b * (d * (k - 1) - c), a * b - d * e)) # y=(a(xfrom+x)+c)/d - k # y=e(x_from+x)/b # print(c) c += x_from * a - d * k f = e * x_from # y=(ax+c)/d # y=(ex+f)/b def check(n): return floor_sum(n, d, a, c) - floor_sum(n, b, e, f) != -n l = 0 r = 1 while not check(r): l = r r *= 2 # print(mode,a * b == e * d,d,a,c,b,e,f) # print('a',a,l,r, x_from) # print(floor_sum(r, d, a, c), floor_sum(r, b, e, f)) while r - l > 1: mid = (l + r) // 2 if check(mid): r = mid else: l = mid return x_from + l xmin = get_min_x(a - 1) # print(xmin) if xmin == -1: return -1 l = -1 r = a - 1 # print(l,r) while r - l > 1: mid = (l + r) // 2 if (a * xmin + mid) // d - e * xmin // b >= k: # print('ok',mid) r = mid else: l = mid # print(a, xmin, r, (a * xmin + mid) // d, e * xmin // d, k) return a * xmin + r for _ in range(int(input())): print(solve(*map(int, input().split()))) # exit()