首 先 l c m = ( x + k ) ( y + k ) / g c d ( x + k , y + k ) 首先lcm=(x+k)(y+k)/gcd(x+k,y+k) lcm=(x+k)(y+k)/gcd(x+k,y+k)

那 么 这 题 的 关 键 是 g c d ( x + k , y + k ) 可 能 的 值 是 有 限 的 \color{Red}那么这题的关键是gcd(x+k,y+k)可能的值是有限的 gcd(x+k,y+k)

先 假 设 b > a , a 和 b 的 g c d ( a , b ) = k 先假设b>a,a和b的gcd(a,b)=k b>a,abgcd(a,b)=k

那 么 a % k = 0 , b % k = 0 , ( b − a ) % k = 0 那么a\%k=0,b\%k=0,(b-a)\%k=0 a%k=0,b%k=0,(ba)%k=0

所 以 有 g c d ( a , b ) = g c d ( a , b − a ) 所以有gcd(a,b)=gcd(a,b-a) gcd(a,b)=gcd(a,ba)

同 理 得 g c d ( x + k , y + k ) = g c d ( x + k , y − x ) 同理得gcd(x+k,y+k)=gcd(x+k,y-x) gcd(x+k,y+k)=gcd(x+k,yx)

那 么 其 实 g c d 的 变 化 是 有 限 的 , 只 可 能 是 y − x 的 因 子 那么其实gcd的变化是有限的,只可能是y-x的因子 gcd,yx

所 以 , 对 于 每 一 种 因 子 , 找 到 最 小 的 k 满 足 g c d ( x + k , y + k ) = 因 子 即 可 所以,对于每一种因子,找到最小的k满足gcd(x+k,y+k)=因子即可 ,,kgcd(x+k,y+k)=

因 此 需 要 凑 的 值 k = 因 子 − x % 因 子 , 当 然 , x % 因 子 = 0 时 k = 0 。 因此需要凑的值k=因子-x\%因子,当然,x\%因子=0时k=0。 k=x%x%=0k=0

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
vector<int>vec;
ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}
ll lcm(ll x,ll y){
	return x/gcd(x,y)*y;
}
int main()
{
	ll a,b;
	cin>>a>>b;
	if(a>b)	swap(a,b);
	ll s=b-a;
	//因为gcd(a,b)=gcd(a,b-a)
	for(int i=1;i*i<=s;i++)//枚举s的因子
	{
		if(s%i==0)
		{
			vec.push_back(i);
			if(i*i!=s)	vec.push_back(s/i);	
		}	
	}
	ll ans=1e18+5,k=0;
	for(int i=0;i<vec.size();i++)
	{
		ll t=0,x=vec[i];
		if(a%x!=0)	t=x-a%x;
		ll temp=lcm(a+t,b+t);
		if(ans>temp)	ans=temp,k=t;
	}
	cout<<k; 
}