首 先 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,a和b的gcd(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,(b−a)%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,b−a)
同 理 得 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,y−x)
那 么 其 实 g c d 的 变 化 是 有 限 的 , 只 可 能 是 y − x 的 因 子 那么其实gcd的变化是有限的,只可能是y-x的因子 那么其实gcd的变化是有限的,只可能是y−x的因子
所 以 , 对 于 每 一 种 因 子 , 找 到 最 小 的 k 满 足 g c d ( x + k , y + k ) = 因 子 即 可 所以,对于每一种因子,找到最小的k满足gcd(x+k,y+k)=因子即可 所以,对于每一种因子,找到最小的k满足gcd(x+k,y+k)=因子即可
因 此 需 要 凑 的 值 k = 因 子 − x % 因 子 , 当 然 , x % 因 子 = 0 时 k = 0 。 因此需要凑的值k=因子-x\%因子,当然,x\%因子=0时k=0。 因此需要凑的值k=因子−x%因子,当然,x%因子=0时k=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;
}