Codefroces1152C 数论 枚举差值因子

lcm(a+k,b+k)=\frac{(a+k)*(b+k)}{gcd(a+k,b+k)}=\frac{(a+k)*(b+k)}{gcd(a+k,b-a)}

枚举b-a的因子 让lcm最小,gcd尽量大,有公因子不为1最好

ll gcd(ll a,ll b)
{
	return b!=0?gcd(b,a%b):a;

}

int main()
{
	IO;

	ll a,b;
	ll k=0;
	cin>>a>>b;
	if(a>b)
		swap(a,b);
	if(b%a==0)
		return cout<<0<<endl,0;
	//cha不带绝对值
	ll cha=b-a,ans=0,minn=a*b/gcd(a,b);
	for(int i=1;i*i<=cha;i++)
	{		//gcd(b-a,a+k) 
		if(cha%i!=0)
			continue;//枚举差值的因子 
		ll k=(i-a%i)%i;//i是cha的因子 若i也为a因子 k=0 使gcd更大
		ll l=(a+k)/gcd(a+k,b+k)*(b+k);
		if(l<minn)
		{
			ans=k;
			minn=l;
		}
		k=(cha/i-a%(cha/i))%(cha/i);
		l=(a+k)/gcd(a+k,b+k)*(b+k);
		if(l<minn)
		{
			ans=k;
			minn=l;
		}
	}
	cout<<ans<<endl;
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_40423146/article/details/89679571