http://codeforces.com/gym/100818 有一个坑点:国外的自然数居然是不包括0的!!!
#include<bits/stdc++.h>
using namespace std;
vector <long long> v;
long long gcd(long long x, long long y)
{
if (y == 0)
return x;
return gcd(y, x%y);
}
int main()
{
// freopen("111.txt","r",stdin);
long long a, b,tt=-1;
while (cin >> a >> b)
{
if (a > b)
swap(a, b);
v.clear();
if (a == b)
{
cout << 1 << endl;
continue;
}
long long n = b - a; //不管怎么加,两个数的差值是固定的,所以有用?
for (long long i = 1; i*i <= n; ++i)
{
if (n%i == 0)
{
v.push_back(i); //存放所有约数
v.push_back(n/i);//存放所有约数
}
}
long long ans = 2000000000000000005; //这个数要比10^18大一点(因为n肯定大于0,所以最终的两个数可能会大于10^9,陷阱啊)
long long minn = 200000000000;
for (int i = 0; i < v.size(); ++i)
{
long long x = (v[i] - a%v[i]); //靠猜/凑的? x是最后n的可能值
long long y = gcd(a + x, b + x);
if (((x + a) / y)*(b + x) < ans)
{
ans = ((x + a) / y)*(b + x);
minn = x;
}
else if (((x + a) / y)*(b + x) == ans&& x<minn)
{
minn=x;
}
}
cout <<minn << endl;
}
return 0;
}