题目链接
题意
现有$$x+y=alcm(x,y)=b$$找出满足条件的正整数(x,y).
(aleq 2e5,bleq 1e9,数据组数12W).
思路
结论
(gcd(x,y)=gcd((x+y),lcm(x,y)))
证明
先证(gcd(x,y)|gcd((x+y),lcm(x,y)))
不妨设(gcd(x,y)=k),则有(kmid x,kmid y),则有(kmid (x+y)) …①
又(kmid x,xmid lcm(x,y)),所以(kmid lcm(x,y)) …②
综合①②有(kmid gcd((x+y),lcm(x,y))).
再证(gcd((x+y),lcm(x,y))|gcd(x,y))
设(gcd((x+y),lcm(x,y))=k_0),则有(k_0|(x+y)). 若(k_0 mid x),则有(k_0 mid y),否则(k_0 mid (x+y)).
而若(k_0 mid x,k_0 mid y),则(exists d1,d1mid k_0,d1 mid x;exists d2,d2mid k_0,d2 mid y).而(forall dmid lcm(x,y),有dmid x或dmid y),...好像不太对......不会证了
// 待补
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a, b;
LL gcd(LL a, LL b) { return b ? gcd(b, a%b) : a; }
void work() {
LL k = gcd(a, b);
LL delta = a*a - 4*k*b;
if (delta < 0) { printf("No Solution
"); return; }
LL ssqrt = sqrt(delta);
if (ssqrt*ssqrt != delta) { printf("No Solution
"); return; }
LL den = a+ssqrt;
if (den&1) { printf("No Solution
"); return; }
LL x = den/2;
LL y = a-x;
if (x > y) swap(x, y);
printf("%lld %lld
", x, y);
}
int main() {
while (scanf("%lld%lld", &a, &b) != EOF) work();
return 0;
}