← Home
```go
package main

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

type factor struct {
	p int64
	e int
}

func factorize(n int64) []factor {
	res := make([]factor, 0)
	if n%2 == 0 {
		cnt := 0
		for n%2 == 0 {
			n /= 2
			cnt++
		}
		res = append(res, factor{2, cnt})
	}
	var i int64 = 3
	for i*i <= n {
		if n%i == 0 {
			cnt := 0
			for n%i == 0 {
				n /= i
				cnt++
			}
			res = append(res, factor{i, cnt})
		}
		i += 2
	}
	if n > 1 {
		res = append(res, factor{n, 1})
	}
	return res
}

func genDivs(factors []factor) []int64 {
	divs := []int64{1}
	for _, f := range factors {
		newDivs := make([]int64, 0, len(divs)*(f.e+1))
		pow := int64(1)
		for e := 0; e <= f.e; e++ {
			for _, v := range divs {
				newDivs = append(newDivs, v*pow)
			}
			pow *= f.p
		}
		divs = newDivs
	}
	return divs
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	for ; t > 0; t-- {
		var a, b, c, d int64
		fmt.Fscan(in, &a, &b, &c, &d)

		fa := factorize(a)
		fb := factorize(b)
		da := genDivs(fa)
		db := genDivs(fb)

		found := false
	outer:
		for _, d1 := range da {
			baseA := a / d1
			for _, d2 := range db {
				dmul := d1 * d2
				kx := c / dmul
				x := kx * dmul
				if x <= a {
					continue
				}
				L := baseA * (b / d2)
				kyMax := d / L
				kyMin := b / L
				if kyMax > kyMin {
					y := kyMax * L
					fmt.Fprintln(out, x, y)
					found = true
					break outer
				}
			}
		}
		if !found {
			fmt.Fprintln(out, -1, -1)
		}
	}
}
```