# -*- coding: utf-8 -*- def mwf_leq(z, n, m, a, b, c, d) raise ArgumentError unless n > 0 && m > 0 sum_acc = -z loop do q, c = c.divmod(m) a += b * q q, d = d.divmod(m) sum_acc += b * q return false if sum_acc > 0 y_max = (c * (n - 1) + d) / m if y_max == 0 return (sum_acc + a * (n - 1)) <= 0 end if sum_acc + [0, a * (n - 1)].max + [0, b * y_max].max <= 0 return true end if a >= 0 return false if (sum_acc + a * (n - 1) + b * y_max) > 0 else sum_acc += a + b end n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1) end end def mwf_lr_leq(z, l, r, m, a, b, c, d) raise ArgumentError unless l < r && m > 0 n = r - l q, d = (c * l + d).divmod(m) mwf_leq(z - a * l - b * q, n, m, a, b, c, d) end def compute_xmin_leq(d, a, b, k) raise ArgumentError unless d > 0 && a > 0 && b > 0 && k >= 0 gcd_da = d.gcd(a) dred = d / gcd_da ared = a / gcd_da mred, rred = (ared * b).divmod(dred) tdelta = b * k return -1 if rred == 0 && dred * k + 1 >= ared lo = 0 hi = ared * b * k + 2 while lo + 1 < hi mid = (lo + hi) / 2 if mwf_lr_leq(tdelta, lo, mid, ared, b, -mred, dred, 0) lo = mid else hi = mid end end d * lo end def solve t = STDIN.readline.to_i t.times do d, a, b, k = STDIN.readline.split.map(&:to_i) raise unless 1 <= d && 1 <= a && 1 <= b && 0 <= k ans = compute_xmin_leq(d, a, b, k) puts ans end end if __FILE__ == $0 solve end