GCD与LCM【数论】

题目大意:
给出两个数的 G C D L C M ,求这两个数的最小差值。
I u p u t

6 36

O u t p u t

6

思路:
一道数论题。
我们设这两个数分别为 x y x y g = g c d ( x , y ) l = l c m ( x , y ) ,那么必然有

l = x g × y g × g

l = x y g g 2

约分得
l = x y g

移项得
l g = x y

由于 g 必然是 x 的因数,所以可以设 k = g x ,则
x = k g
带入上式,得
l g = k g y
,
根据等式的性质,得
l g = k g l k

那么只要枚举 k ,我们就可以求出正确答案了。


代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

long long g,l,x,y,z,ans;

int main()
{
    scanf("%d%d",&g,&l);
    for (long long i=1;1;i++)
    {
        if (g*i>l/i) return printf("%d\n",ans)&0;  //当a>b时,程序结束
        if (l%i) continue;  //l不能整除i(即上文所述k)
        x=g*i;
        y=l/i;  //求出两数的值
        z=__gcd(x,y);  
        if (z==g&&x*y==g*l) ans=l/i-i*g;  //判断是否成立
    }
}

猜你喜欢

转载自blog.csdn.net/ssl_zyc/article/details/80978269