题目描述:
题目大意:输入 a b c d 四个数,找出任意一个满足条件的 x,y , a < x <= c, b < y <= d, 使得 xy 是 ab 的倍数
算法思想:暴力枚举
我们遍历每一个 x , 找到 x 和 a* b 的最大公因数 z, 那么 y 肯定是 a*b / z 的倍数。我们令 w = a*b / z.
如果 d % w == 0, 那么我们 y 就取d;如果 d/w > b/w, 那么在 (b,d] 中必定存在一个数,使得它为 w 的倍数,这个数可以是 d/w *w, 即 * w.
AC代码:
#include<iostream>
using namespace std;
#include<numeric>
long long __gcd(long long a, long long b){
long long r;
while(b>0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main(){
int t;cin>>t;
while(t--){
long long a,b,c,d,x=-1,y=-1;cin>>a>>b>>c>>d;
for(long long i=a+1;i<=c;++i){
long long res=a*b;
long long f=__gcd(res,i);
res/=f;
if(d%res==0||(d/res>b/res)) {x=i;y=res*(d/res);break;}
}
cout<<x<<" "<<y<<endl;
}
return 0;
}