Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)

题目:http://codeforces.com/contest/1152/problem/C

题意:给你a,b, 你可以找任意一个k     算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出这个k

思路:

因为现在两个都是未知数,我们无法确定

我们根据gcd底层实现原理 

gcd(a+k,b+k) = gcd(b-a,a+k)

a=c*x;

b=c*y;

b-a=c*(y-x)

所以证明b-a的因子是a的因子也是b的因子

那么我们只要枚举出b-a的因子,然后再套入a+k中求得k,然后枚举取最优即可

#include<bits/stdc++.h>
#define maxn 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll a,b;
ll mx;
ll k;
void suan(ll x)
{
    ll kk=(x-a%x)%x;
    ll dx=(a+kk)/x*(b+kk);
    if(mx==-1)
    {
        mx=dx;
        k=kk;
    }
    else if(dx==mx){
        k=min(k,kk);
    } 
    else if(dx<mx){
        mx=dx;
        k=kk;
    }
}
int main()
{
    cin>>a>>b;
    if(a>b){
        ll t=b;
        b=a;
        a=t;
    }
    mx=-1;
    k=-1;
    ll sum=0;
    ll z=b-a;
    ll t=sqrt(z);
    for(int i=1;i<=t;i++)
    {
        if(z%i==0)
        {
            suan(i);
            suan(z/i);
        }    
    }
    cout<<max(k,(ll)0);
}

猜你喜欢

转载自www.cnblogs.com/Lis-/p/10770632.html
今日推荐