def floorsum(n,m,a,b) : if a == 0 : return b//m * n ans = 0 while n != 0 : if a >= m : ans += a // m * (n * (n-1) // 2) a %= m if b >= m : ans += b // m * n b %= m yx = a * n + b if yx < m : return ans n = yx // m b = yx % m yx = a a = m m = yx return ans q = int(input()) for i in range(q) : n,d,m,s = map(int, input().split()) s = 2 ** s dif = abs(s - m*d) if dif == 0 : print(n, flush=False) continue n = min(n, d*s // dif) ans = n ans -= abs(floorsum(n+1,d,1,0) - floorsum(n+1,s,m,0)) print(ans,flush=False)