Description

给定两个正整数 $ a,b $,找到非负整数 $ k $ 使 $ a+k $ 与 $ b+k $ 的最小公倍数最小,如有多解输出最小的 $ k $

Solution

两数的差始终为 \(b-a\),而两数的 \(gcd\) 必然是 \(b-a\) 的因数

因此枚举 \(b-a\) 的因数作为 \(g\),然后求出能使得 \(g|(b+k)\) 的最小的 \(k\),很显然此时一定满足 \(g|(a+k)\)

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

int a,b,ans=1e18,tans=0;

signed main() {
    cin>>a>>b;
    if(a==b) {cout<<0; return 0;}
    if(a>b) swap(a,b);

    vector<int> fac;
    for(int i=1;i*i<=b-a;i++) if((b-a)%i==0) fac.push_back(i), fac.push_back((b-a)/i);
    for(int i:fac) {
        int k=i-(b-1)%i-1,m=(a+k)*(b+k)/i;
        if(m<ans) ans=m,tans=k;
    }
    cout<<tans;
}

相关文章: