zoukankan      html  css  js  c++  java
  • L

    题目大意:输入两个数 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;
    }
  • 相关阅读:
    ajax简单案例
    jquery中的数据传输
    java-Reflect
    Factory Method 和AbstractFactory
    Singleton
    英语六级口语备考指南
    ACM信息汇总
    jquery练习
    char可不可以存汉字
    信息安全
  • 原文地址:https://www.cnblogs.com/Accepting/p/12567616.html
Copyright © 2011-2022 走看看