【dfs】GCD与LCM(jzoj 1608)

版权声明:欢迎借鉴,谢绝抄搬。 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;
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86635850
今日推荐