CF1916B Two Divisors

发布时间 2023-12-31 13:18:54作者: One_JuRuo

思路

看到题目要求求一个数 \(x\),满足它的最大的两个因数分别是 \(a\)\(b\),并且规定一个数本身不是他的因数。

首先 \(x\) 需要是 \(a\)\(b\) 的倍数,所以想到最小公倍数,如果不考虑最小公倍数等于 \(b\),最小公倍数就一定是答案,因为最小公倍数是最小的满足是 \(a\)\(b\) 倍数的数了,其他的答案都一定是最小公倍数乘以一个数 \(k\),但是这样,\(a\times k\)\(b\times k\) 就比原来的大,一定不是答案。

所以如果最小公倍数不是答案,就没有答案了,而题目又保证了存在答案,所以这种情况最小公倍数就是答案。

再考虑有些情况会导致最小公倍数等于 \(b\),也就是 \(a\)\(b\) 的因数。考虑到答案一定是 \(b\) 的倍数,所以考虑答案是 \(b\) 乘以几,首先如果是随便的一个 \(k\),那么会导致 \(a\times k\) 大于 \(a\),使得 \(a\) 不是次大的因数,所以我们考虑让 \(a\times k=b\),这样才可能让 \(a\) 成为次大因数,所以答案就是 \(b\times \frac b a\)。同样的,如果这个答案不合法,就不可能存在其他答案合法,题目又保证一定存在答案,所以这个答案正确。

AC code

#include<bits/stdc++.h>
using namespace std;
long long T,a,b,gc;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld%lld",&a,&b),gc=__gcd(a,b),a/=gc,b/=gc,b*=a;//此时,b是最小公倍数除以最大公因数
		if(a==1) b*=b;//如果b是a的倍数,那么答案需要额外乘以b/a
		printf("%lld\n",b*gc);//记得把最大公因数乘回去
	}
	return 0;
}