a+k与b+k的最小公倍数 求k最小
lcm=a∗b/gcd
gcd(a,b)=gcd(a,b-a)
a和b加上k之后产生的最大公因数必然是a-b的因子
求差值 枚举差值的所有因子
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+5; ll gcd(ll x,ll y) { return y==0 ? x: gcd(y,x%y); } ll lcm(ll x,ll y) { return x*y/gcd(x,y); } int main() { vector<int>v; ll a,b; cin>>a>>b; if(a>b) swap(a,b); ll s=b-a; for(int i=1;i*i<=s; i++) { //s的所有素数因子 if(s%i==0) { v.push_back(i); if(i*i!=s) v.push_back(s/i); } } ll ans=1e18+5,k; for(int i=0; i<v.size(); i++) { //枚举所有v ll t=0,x=v[i]; if(a%x!=0) t=x-a%x; x=lcm(a+t,b+t); if(ans>x) { ans=x; k=t; } } if(a==b) k=0; cout<<k<<endl; return 0; }