题意:给出a,b,求k,使得LCM((a+k),(b+k))最小。
思路:不难想到,可能的gcd值为a和b的差值gap的所有约数,所以可以写处理出差值的约数,然后枚举每个约数,维护最小lcm,相同则维护较小的距离。
vector<int> tmp;
void x_x(int x)
{
f(i, 1, x / i)
{
if (x%i == 0)
{
tmp.emplace_back(i);
tmp.emplace_back(x / i);
}
}
}
int main()
{
int a, b;
while (cin >> a >> b)//求出 a,b可能的最大公约数,枚举维护最小
{
int gap = max(a, b) - min(a, b);
if (gap == 0) { cout << 0 << endl;continue; }
x_x(gap);
ll res = 2e18, res2 = 2e18;
for (auto I : tmp)
{
int k = (int)ceil(min(a, b)*1.0 / I);//到达最小的倍数
ll now = (ll)k * (k + gap / I)*I;
//debug(now);
if (now < res2) {
res2 = now;
res = (ll)k*I - min(a, b);
}
else if (now == res2)
{
res = min((ll)k*I - min(a, b), res);
}
}
cout << res << endl;
}
return 0;
}