def mwf(n, m, a, b, c, d) raise ArgumentError unless n > 0 && m > 0 sum_acc = 0 max_acc = b * (d / m) loop do q, c = c.divmod(m) a += b * q q, d = d.divmod(m) sum_acc += b * q raise unless 0 <= c && c < m && 0 <= d && d < m max_acc = [max_acc, sum_acc].max y_max = (c * (n - 1) + d) / m if y_max == 0 return [max_acc, sum_acc + a * (n - 1)].max end if a >= 0 max_acc = [max_acc, sum_acc + a * (n - 1) + b * y_max].max else sum_acc += a + b end n, m, a, b, c, d = y_max, c, b, a, m, (m - d - 1) end end def compute_xmin(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(mid, ared, b, -mred, dred, 0) <= tdelta 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) ans = compute_xmin(d, a, b, k) puts ans end end if __FILE__ == $0 solve end