码迷,mamicode.com
首页 > 编程语言 > 详细

codeforce 1152C. Neko does Maths(欧几里得算法)

时间:2019-04-26 21:17:14      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:公倍数   欧几里得算法   space   using   inf   namespace   需要   欧几里得   syn   

找到一个k使得a+k与b+k的最大公倍数lcm最小 

欧几里得算法:gcd(a,b) = gcd(b,a mod b)。

技术图片

 

 gcd是b-a的除数。 让我们迭代b-a的所有除数q。 这也意味着a(modq)= b(modq)。 如果a(modq)= 0,我们可以使用k = 0。

否则,相应的k应为q-a(modq)。 最后,我们需要检查lcm(a + k,b + k)的值是否是迄今为止找到的最小值。

 

 

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll a,b;

int main()
{
    ios::sync_with_stdio(false);
    cin>>a>>b;
    ll d=abs(a-b);
    ll ans=0;
    ll h=a/__gcd(a,b)*b;
    if(b==a){
        cout<<"0"<<endl;
        return 0;
    }
    else{
        ll k,v;
        for(int i=1;i*i<=d;i++){
            if(d % i != 0) continue;
            k=i;
            k=(k-(a%k))%k;//保证k为满足当前情况的最小值
            v= (a+k)/__gcd(a+k,b+k)*(b+k);
            if(v<h){
                h=v;
                ans=k;
            }
            if(v==h) ans=min(ans,k);
            k=d/i;
            k=(k-(a%k))%k;
            v= (a+k)/__gcd(a+k,b+k)*(b+k);
            if(v<h){
                h=v;
                ans=k;
            }
            if(v==h) ans=min(ans,k);
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

codeforce 1152C. Neko does Maths(欧几里得算法)

标签:公倍数   欧几里得算法   space   using   inf   namespace   需要   欧几里得   syn   

原文地址:https://www.cnblogs.com/Fy1999/p/10776343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!