题目大意:给你a,b,c,d 四个数 ,a<c并且b<d,然后让你找两个数x,y,在
a<x<=c,b<y<=d的前提下,并且满足x*y能够整除a*b。
思路 :之前想着暴力,但是暴力的方式一直都不对,之后发现豁然开朗呜呜呜~
首先从遍历a到c的范围,然后把a*b和i的包含的因子(最大公约数)提取出来,
ll j=a*b/(__gcd(a*b,i));
然后剩下的数就是要求b-d内的数有没有能被剩下的数给整除,这里可以用d/j*j来表示小于d的最大的能够被j整除的数,然后判断是不是能够大于b(最小值)就可以了
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
ll s[N];
int main()
{
int t ;
cin>>t;
while(t--)
{
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll x=-1,y=-1;
for(ll i=a+1;i<=c;i++)
{
ll j=a*b/(__gcd(a*b,i));//j是剩下的要算的因数的乘积
if(d/j*j>b)//d/j*j是小于d最大的j的的倍数
{
x=i;
y=d/j*j;
break;
}
}
cout<<x<<" "<<y<<endl;
}
return 0;
}