【Codeforces Round #828 (Div. 3)-E2】【约数求某个范围内的数】【把分解质因数问题放大变成一个分解约数的问题】【求一个数的所有约数模板】

 

 

/*
没必要 看的太小,比如分解质因数啥的,
质因数是细分,
不如粗略地分,
分解约数 
*/


#include <bits/stdc++.h>
using namespace std;
typedef long long LL;


void solve()
{
	LL a,b,c,d;
	cin>>a>>b>>c>>d;
	/*
	x*y=k*a*b
	*/
	//x:[a,c]
	//y: [b,d] 
	
	vector<LL> re1,re2;
	
	//存约数模板
	for(int i=1;i*i<=a;i++)
	{
		if(a%i==0)
		{
			re1.push_back(i);
			re1.push_back(a/i);
		}
	} 
	
	
	for(int i=1;i*i<=b;i++)
	{
		if(b%i==0)
		{
			re2.push_back(i);
			re2.push_back(b/i);
		}
	}
	
	/*
	我们是想让 k*a*b==x*y
	其实没必要用a,b直接求,
	可以用a,b的约数,假设分别为m*n
	k*m*n==x*y 
	*/
	
	
	vector<LL> f;
	for(auto m:re1)
	{
		for(auto n:re2)
		{
			f.push_back(m*n);  //存a*b的半个约数,另外半个约数可以用a*b/这半个约数得到 
		}
	}
	
	
	sort(f.begin(),f.end());
	f.erase(unique(f.begin(),f.end()),f.end());
	
	LL resx=-1,resy=-1;
	for(auto v:f)
	{
		LL ansx=c/v*v;
		LL v2=a*b/v; 
		LL ansy=d/v2*v2;
		
		if(ansx>a&&ansy>b)
		{
			resx=ansx;
			resy=ansy;
			break;
		}
	}
	
	
	cout<<resx<<" "<<resy<<endl;
	
	
	return;
	
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int T;
	cin>>T;
	while(T--)
	{
		solve();
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值