题目大意:输入两个数 a,b,输出一个k使得lcm(a+k,b+k)尽可能的小,如果有多个K,输出最小的。
题解:
假设gcd(a+k,b+k)=z;
那么(a+k)%z=(b+k)%z=0。 a%z+k%z=b%z+k%z;a%z=b%z;(a-b)%z=0;
也就是说,z一定是a-b的因子。a-b是已知的,枚举a-b的因子就好了。
也就是枚举z,因为(a+k)%z==0,如果让k最小,那么k=z-a%z。
#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; typedef long long ll; ll a, b; ll ansk, ans; 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); } void solve(ll x){ ll k = x - a % x; if (lcm(a + k, b + k) < ans) { ans = lcm(a + k, b + k); ansk = k; } } int main() { cin >> a >> b; ansk = 0; ans = lcm(a, b); ll c = max(a, b) - min(a, b); for (ll i = 1; i*i <= c; i++) { if (c % i == 0) { solve(i); solve(c / i); } } cout << ansk << endl; return 0; }