Loading

C. Neko does Maths

a+k与b+k的最小公倍数 求k最小

lcm=a∗b/gcd

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

a和b加上k之后产生的最大公因数必然是a-b的因子

求差值 枚举差值的所有因子

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll gcd(ll x,ll y) { return y==0 ? x: gcd(y,x%y); }
ll lcm(ll x,ll y) { return x*y/gcd(x,y); }
int main() {
    vector<int>v;
    ll a,b;
    cin>>a>>b;
    if(a>b) swap(a,b);
    ll s=b-a;
    for(int i=1;i*i<=s; i++) { //s的所有素数因子 
        if(s%i==0) {
            v.push_back(i);
            if(i*i!=s) v.push_back(s/i);
        }
    }
    ll ans=1e18+5,k;
    for(int i=0; i<v.size(); i++) { //枚举所有v 
        ll t=0,x=v[i];
        if(a%x!=0) t=x-a%x;
        x=lcm(a+t,b+t);
        if(ans>x) {
            ans=x;
            k=t;
        }
    }
    if(a==b) k=0;
    cout<<k<<endl;
    return 0;
}

 

posted @ 2019-04-30 17:35  qinuna  阅读(164)  评论(0编辑  收藏  举报