L - Neko does Maths CodeForces - 1152C 数论(gcd)

题目大意:输入两个数 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;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/12567616.html
今日推荐