jzoj1013-GCD与LCM【数论】

正题


大意

给出某对数a,b的gcd和lcm,然后求b-a的最小值


解题思路

我们定义A为 g c d ( a , b ) ,B为 l c m ( a . b )
首先我们拿出推lcm的公式

B = a b / A

然后移项得
a b = A B ( A a , b B )

之后我们就可以枚举了。首先因为只有 A 的倍数 g c d ( a , b ) 才可能等于 A ,所以我们枚举的时候可以一次增加 A ,然后就可以了。


代码

#include<cstdio>
#include<algorithm>
#define minx(x,y) x>y:y?x
using namespace std;
long long A,B,C,mins;
int main()
{
    scanf("%lld%lld",&A,&B);
    C=A*B;mins=1e18;
    for (long long i=A;i<=B;i+=A)
    {
        long long w=C/i;
        if (i>w) break; 
        if (i*w==B*A&&__gcd(i,w)==A)
        {
            mins=min(mins,abs(C/i-i));
        }
    }
    printf("%lld",mins);
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/80978171