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;dfs(1,1,1);printf("%lld",ans*n);return 0;
}