[CF1152C] Neko does Maths

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;
}
原文地址:https://www.cnblogs.com/mollnn/p/12828106.html