题意:给出四个整数a,b,c,d,找出[a,c]中x,[b,d]中y,
使得(x * y)%(a * b)==0
思路:
从因数的角度考虑问题 首先分别求出a,b的因数与1存入数组 然后求出两个数组元素两两相乘 (这一步实际上就是把a b因子分为两部分重新组合成新的两个数,一个数x存起来,另一个数则为a*b/x)
最后 每次枚举一组 ,分别判断这两个数的倍数是否在[a,c][b,d]中,如果存在这样的两个数,则输出。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve()
{
vector<ll> f1,f2,f;
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll maxn=a*b;
for (int i=1;i*i<=a;i++)
{
if (a%i==0)
{
f1.push_back(i);
if (a/i!=i)
f1.push_back(a/i);
}
}
for (int i=1;i*i<=b;i++)
{
if (b%i==0)
{
f2.push_back(i);
if (b/i!=i)
f2.push_back(b/i);
}
}
for (auto i:f1)
for (auto j:f2)
{
f.push_back(i*j);
}
int x=-1,y=-1;
for (auto i:f)
{
ll xx=c/i*i;
ll yy=d/(maxn/i)*(maxn/i);
if (xx>a&&yy>b)
{
x=xx;
y=yy;
break;
}
xx=c/(maxn/i)*(maxn/i);
yy=d/i*i;
if (xx>a&&yy>b)
{
x=xx;
y=yy;
break;
}
}
cout<<x<<" "<<y<<"\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}