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

Posted fy1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforce 1152C. Neko does Maths(欧几里得算法)相关的知识,希望对你有一定的参考价值。

找到一个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(欧几里得算法)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces-1152C Neko does Maths(GCD)

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

Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)

C. Neko does Maths(数论 二进制枚举因数)

Codeforces . C.Neko does Maths

CodeForces 1152F2 Neko Rules the Catniverse (Large Version)