题目链接:http://codeforces.com/contest/1152/problem/C
题目思路:要想使得lcm(a+k,b+k)变小,那么只能通过增大gcd(a+k,b+k)来实现,根据更相减损术,
gcd(a,b)=gcd(b+k,a-b) (a>b)
那么对于右边b+k=x*gcd , a-b=y*gcd 。a-b是个定值,所以要得到两者的gcd可以枚举a-b的所有因子,算出符合题目的结果
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN=1e5+5;
vector<ll>v;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
ll a,b;
cin>>a>>b;
if(a==b){
cout<<0<<endl;return 0;
}
ll mm=a*b/gcd(a,b);
if(a<b)swap(a,b);
ll c=a-b;
for(ll i=1;i<=sqrt(c);i++){
v.push_back(i);
v.push_back(c/i);
}
ll Min=1ll<<62,MMin=1ll<<62;
for(ll i=0;i<v.size();i++){
ll now=(v[i]-b%v[i])%v[i];
ll com=(a+now)*(b+now)/gcd(a+now,b+now);
if((com<MMin)||(com==MMin&&now<Min)){
MMin=com;Min=now;
}
}
if(MMin==mm){
cout<<0<<endl;
}
else cout<<Min<<endl;
}