题目大意:
a,b构成最大公约数和最小公倍数,让你通过最大公约数和最小公倍数求出a与b最接近的可能,再求出b-a。
输入
输入数据只有一行,包括两个整数GCD和LCM。输入保证至少存在一组解。
输出
输出包含一个整数,为最小的b-a的值。
样例输入
6 36
样例输出
6
数据范围限制
提示
数据说明:
对于50%的数据,1<=a<=b<=10^3。
对于100%的数据,1<=a<=b<=10^9。
思路:
短除法求底数。
代码:
#include<cstdio>
#include<cmath>
using namespace std;
long long gcd(long long x,long long y)
{
if(y==0)
return x;gcd(y,x%y);//最大公约数。
}
long long n,m,min;//定义
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%lld %lld",&n,&m);//输入。
unsigned long long x=m/n;//两个底数的乘积。
for(long long a=1,b=100;a<=m;a++)
{
b=x/a;//求出b的值
if(x%a==0&&gcd(a*n,b*n)==n)//判断是不是有余数,gcd(a*n,b*n)==n是因为ab还是会有最大公约数。
{
if(a>b)//可分为两段一样的,跳出。
break;//跳出。
else
min=b-a;//底数
}
}
printf("%lld",min*n);//输出。
return 0;
}