Neko does Maths(数论)

Neko does Maths

题意:

给两个数a与b,求最小的lcm(a+k,b+k),(1≤a,b≤1091≤a,b≤109). (k≥0k≥0)

解析:

求最小的lcm(a+k,b+k)即求最大的gcd(a+k,b+k)

,假设b>a,gcd(a,b)=gcd(a,b-a)

(a+k)*(b+k)/gcd(a+k,b-a),b-a已知,枚举b-a的因子,即可求得答案

(a+k)%i==0,(a%i+k%i)==(1||0),=>   k=(i-a%i)%i

ac:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int> vc;

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));
}

int main()
{
    ll a,b;
    cin>>a>>b;
    if(a>b)
        swap(a,b);
    ll c=b-a;
    for(ll i=1;i*i<=c;i++)
    {
        if(c%i==0)
        {
            vc.push_back(i);
            vc.push_back(c/i);
        }
    }
    ll ans=1e18,qq=0;
    for(ll i=0;i<vc.size();i++)
    {
        ll v=vc[i];
        ll k=(v-a%v)%v;
        ll lcmi=lcm(a+k,b-a);
        if(lcmi<ans||(lcmi==ans&&k<qq))
        {
            ans=lcmi;
            qq=k;
        }
    }
    printf("%lld\n",qq);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/89521857
今日推荐