题意:让两数加上同时加上k,使得公倍数最小。
思路:首先有个结论 gcd(a,b)=gcd(a,b-a), 因为假设gcd(a,b)=c,那么a%c=b%c=0,又有(a-b)%c=0,所以 gcd(a,b)=gcd(a,b-a),根据题意,让lcm最小那么就是要求最大的gcd,最大的gcd必定是两数中最大的约数,由于题目中b-a是定值,所以就可以枚举b-a的约数,然后把a凑到含有此约数为止,因此需要凑的值k=x-a%x,当然,a%x=0时k=0.除此之外记得开ll。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int>v;
int main()
{
ll a,b;
cin>>a>>b;
if(a>b)
{
swap(a,b);
}
ll tmp=(b-a);
for(int i=1;i*i<=tmp;i++)
{
if(tmp%i==0)
{
v.push_back(i);
if(i*i!=tmp)
{
v.push_back(tmp/i);
}
}
}
ll ans=1e18+10;
int minn;
for(int i=0;i<v.size();i++)
{
ll k=a%v[i];
if(k!=0)
k=v[i]-k;
ll sum=(a+k)*(b+k)/__gcd(a+k,b+k);
if(sum<ans)
{
ans=sum;
minn=k;
}
else if(sum==ans)
{
if(k<minn)
minn=k;
}
}
if(a==b)
{
cout<<0<<endl;
}
else
cout<<minn<<endl;
return 0;
}