版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86635850
GCD与LCM
题目大意:
给出a,b的最大公因数和最小公倍数,求出符合条件的a,b的最小差值
样例输入
6 36
样例输出
6
数据范围限制
提示
数据说明:
对于50%的数据,1<=a<=b<=10^3。
对于100%的数据,1<=a<=b<=10^9。
解题思路:
先用最小公倍数除以最大公因数,得出a,b(已经除过最大公因数)的乘积,然后分解质因数,将相同的乘在一起,再用dfs分配到两边求出最小的差,最后还要乘上最大公因数
#include<cstdio>
#include<iostream>
using namespace std;
long long n,m,t,num,ans,a[10005];
int w,o;
long long minn(long long xx,long long yy)//求最小的
{
if (xx<yy) return xx;
return yy;
}
void dfs(long x,long y,int dep)//分配
{
if (dep>w)
{
if (x>y) ans=minn(ans,x-y);//要使差是整数
else ans=minn(ans,y-x);
return;
}
dfs(x*a[dep],y,dep+1);//分配给左边
dfs(x,y*a[dep],dep+1);//分配给右边
}
int main()
{
scanf("%lld %lld",&n,&m);
t=m/n;
num=2;
while(t!=1)//没有除完
if (t%num==0) //可以整除
{
t/=num;//除
if (o) a[w]*=num;//已经有同样的数,就乘在一起,避免不是互质
else a[++w]=num,o=1;//没有同样的数,自己单独一个
}else num++,o=0;//除数++
ans=9223372036854775807;//long long的范围,2^63-1
dfs(1,1,1);//dfs分配
printf("%lld",ans*n);//乘上最大公因数
return 0;
}