← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func gcd(a, b int64) int64 {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func mod(a, m int64) int64 {
	res := a % m
	if res < 0 {
		res += m
	}
	return res
}

func find_first(A, M, U, V int64) int64 {
	if U == 0 {
		return 0
	}
	if A == 0 {
		return -1
	}
	k := (U + A - 1) / A
	if k*A <= V {
		return k
	}

	U_prime := A - (V % A)
	V_prime := A - (U % A)

	y := find_first(M%A, A, U_prime, V_prime)
	if y == -1 {
		return -1
	}

	rem := mod(-y*M-U, A)
	Z := U + rem
	return (y*M + Z) / A
}

func solve_interval(A, M, U, V, L, R int64) int64 {
	A = A % M
	C := mod(A*L, M)
	U_shift := mod(U-C, M)
	V_shift := mod(V-C, M)

	var t int64
	if U_shift <= V_shift {
		t = find_first(A, M, U_shift, V_shift)
	} else {
		t = 0
	}

	if t != -1 && t <= R-L {
		return L + t
	}
	return -1
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	readInt64 := func() int64 {
		if !scanner.Scan() {
			return 0
		}
		var res int64
		for _, c := range scanner.Bytes() {
			res = res*10 + int64(c-'0')
		}
		return res
	}

	t := int(readInt64())

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	for i := 0; i < t; i++ {
		a := readInt64()
		b := readInt64()
		p := readInt64()
		q := readInt64()

		g := gcd(p, q)
		P := p / g
		Q := q / g

		A := 2 * P
		M := 2 * Q

		low := int64(0)
		high := Q
		ans_x := int64(-1)

		for low <= high {
			mid := low + (high-low)/2
			U := Q - mid
			V := Q + mid
			if V >= M {
				V = M - 1
			}
			if U < 0 {
				U = 0
			}

			x := solve_interval(A, M, U, V, a, b)
			if x != -1 {
				ans_x = x
				high = mid - 1
			} else {
				low = mid + 1
			}
		}

		fmt.Fprintf(writer, "%d\n", ans_x)
	}
}