求最小的 k k k 使得 l c m ( a + k , b + k ) lcm(a+k,b+k) lcm(a+k,b+k) 最小。
l c m ( a + k , b + k ) = ( a + k ) ( b + k ) g c d ( a + k , b + k ) = ( a + k ) ( b + k ) g c d ( a + k , a − b ) lcm(a+k,b+k)=\frac{(a+k)(b+k)}{gcd(a+k,b+k)}=\frac{(a+k)(b+k)}{gcd(a+k,a-b)} lcm(a+k,b+k)=gcd(a+k,b+k)(a+k)(b+k)=gcd(a+k,a−b)(a+k)(b+k)
枚举 a − b a-b a−b 的因子,根据 g c d ( a + k , a − b ) gcd(a+k,a-b) gcd(a+k,a−b) 算出最小的 k k k 。
注意初始化
#include<iostream>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
#define N 200000
using namespace std;
long long a,b,k,i,p,d,lcm,reslcm,resk;
void www(long long i)
{
if (b % i == 0) k = 0; else
{
p = b / i + 1; p = p * i;
k = p - b;
lcm = (a*b+k*(a+b)+k*k)/i;
if (lcm < reslcm) {reslcm = lcm; resk = k;}
else if (lcm == reslcm) if (k < resk) resk = k;
}
}
long long gcd(long long a,long long b)
{
if (a%b==0) return b; else return gcd(b,a%b);
}
int main()
{
cin>>a>>b;
if (a < b) swap(a,b);
reslcm = a * b / gcd(a,b); k = 0;
d = a - b;
fo(i,1,sqrt(d))
if (d % i == 0)
{
www(i);
www(d/i);
}
cout<<resk<<endl;
return 0;
}