GCD与LCM【数论】

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

6 36

Output O u t p u t

6

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

l=xg×yg×g l = x g × y g × g

l=xygg2 l = x y g g 2

约分得
l=xyg l = x y g

移项得
lg=xy l g = x y

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

那么只要枚举 k k<script type="math/tex" id="MathJax-Element-200">k</script>,我们就可以求出正确答案了。


代码:

#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;  //判断是否成立
    }
}

版权声明:本文为SSL_ZYC原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。