gcd与lcm
题目描述
给出某两个整数a和b(a<=b)的最大公约数GCD和最小公倍数LCM,请找出满足的a和b,使得b-a的值最小。
输入格式
输入数据只有一行,包括两个整数GCD和LCM。输入保证至少存在一组解。
输出格式
输出包含一个整数,为最小的b-a的值。
样例数据
input
6 36
output
6
数据规模与约定
保证1≤a,b≤1e9。
算法一
因为
设lcm(a,b)=n,gcd(a,b)=m,则a*b=nm
所以a,b都是n与m乘积的因子,所以我们只需要枚举nm的因子,求出最小的b-a值即可
因为求b-a最小值,所以a,b最接近,可以从根号n倒叙枚举
时间复杂度,因为a,b的取值范围较大,所以可以被特殊数据卡掉
算法二
设 gcd(a,b)= m,lcm(a,b)=n;
则a可以表示为 x*m,b可以表示为y*m
所以
即
所以
所以可以枚举n/m的因子,同算法一可算出x,y,因为a,b的最大公因数是m,所以x和y必须互质,否则这个最大公因数就是错的。
再根据x,y得出a,b
时间复杂度
代码如下
#include<bits/stdc++.h>
using namespace std;
long long get_gcd(int x,int y)
{
if(y==0) return x;
else return get_gcd(y,x%y);
}
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
for(int i=sqrt(m/n);i>0;i--)
{
if((m/n)%i==0)
{
int j=m/n/i;
if(get_gcd(i,j)==1)
{
printf("%lld",j*n-i*n);
return 0;
}
}
}
return 0;
}