题目大意:
给出两个数的和,求这两个数的最小差值。
6 36
6
思路:
一道数论题。
我们设这两个数分别为和且,,,那么必然有
即
约分得
移项得
由于必然是的因数,所以可以设,则
带入上式,得
,
根据等式的性质,得
那么只要枚举,我们就可以求出正确答案了。
代码:
#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; //判断是否成立
}
}