GCD与LCM【数论】

题目大意:
给出两个数的GCDLCM,求这两个数的最小差值。
Iuput

6 36

Output

6

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

l=xg×yg×g

l=xygg2

约分得
l=xyg

移项得
lg=xy

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

那么只要枚举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;  //判断是否成立
    }
}
posted @ 2018-07-09 22:08  全OI最菜  阅读(197)  评论(0)    收藏  举报