题意:给出a, b,问是否存在x + y = a; LCM(x, y) = b.
思路:可知,gcd(A, B) = gcd(A + B, LCM(A, B)),所以有gcd(x, y) = gcd(a, b), 则有 x + (b * gcd(a, b)) / x = a;解这个方程组,然后在判断一下gcd(x, a - x)是否等于b即可
#include<cstdio>
#include<cmath>
#include<algorithm>
const double eps = 1e-6;
typedef long long ll;
using namespace std;
ll GCD(ll a, ll b) { return b ? GCD(b, a % b) : a; }
int main() {
ll a, b, x, y;
while(scanf("%lld %lld", &a, &b) != EOF) {
ll g = GCD(a, b);
double dt = a * a - 4 * b * g;
double res = (a - sqrt(dt)) / 2;
x = (ll)res;
if(fabs(x - res) > eps) x++;
y = a - x;
if(x * y / GCD(x, y) != b) printf("No Solution\n");
else printf("%lld %lld\n", x, y);
}
return 0;
}