Description
给定两个正整数 $ a,b $,找到非负整数 $ k $ 使 $ a+k $ 与 $ b+k $ 的最小公倍数最小,如有多解输出最小的 $ k $
Solution
两数的差始终为 (b-a),而两数的 (gcd) 必然是 (b-a) 的因数
因此枚举 (b-a) 的因数作为 (g),然后求出能使得 (g|(b+k)) 的最小的 (k),很显然此时一定满足 (g|(a+k))
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int a,b,ans=1e18,tans=0;
signed main() {
cin>>a>>b;
if(a==b) {cout<<0; return 0;}
if(a>b) swap(a,b);
vector<int> fac;
for(int i=1;i*i<=b-a;i++) if((b-a)%i==0) fac.push_back(i), fac.push_back((b-a)/i);
for(int i:fac) {
int k=i-(b-1)%i-1,m=(a+k)*(b+k)/i;
if(m<ans) ans=m,tans=k;
}
cout<<tans;
}