题意:
给两个数a与b,求最小的lcm(a+k,b+k),(1≤a,b≤1091≤a,b≤109). (k≥0k≥0)
解析:
求最小的lcm(a+k,b+k)即求最大的gcd(a+k,b+k)
,假设b>a,gcd(a,b)=gcd(a,b-a)
(a+k)*(b+k)/gcd(a+k,b-a),b-a已知,枚举b-a的因子,即可求得答案
(a+k)%i==0,(a%i+k%i)==(1||0),=> k=(i-a%i)%i
ac:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int> vc;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
return a*(b/gcd(a,b));
}
int main()
{
ll a,b;
cin>>a>>b;
if(a>b)
swap(a,b);
ll c=b-a;
for(ll i=1;i*i<=c;i++)
{
if(c%i==0)
{
vc.push_back(i);
vc.push_back(c/i);
}
}
ll ans=1e18,qq=0;
for(ll i=0;i<vc.size();i++)
{
ll v=vc[i];
ll k=(v-a%v)%v;
ll lcmi=lcm(a+k,b-a);
if(lcmi<ans||(lcmi==ans&&k<qq))
{
ans=lcmi;
qq=k;
}
}
printf("%lld\n",qq);
return 0;
}