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

来源:互联网 发布:sqlserver 2005 dev 编辑:程序博客网 时间:2024/05/16 16:21


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;}


1 0
原创粉丝点击