题目大意:
给出两个数的GCD G C D和LCM L C M,求这两个数的最小差值。
Iuput I u p u t
6 36
Output O u t p u t
6
思路:
一道数论题。
我们设这两个数分别为x x和且x≤y x ≤ y,g=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必然是的因数,所以可以设 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版权协议,转载请附上原文出处链接和本声明。