您的位置:首页 > 其它

SEERC15 求一个正整数n,使得a+n和b+n的LCM值最小

2015-12-08 15:46 357 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: