hdu 5974 A Simple Math Problem gcd(x,y)=gcd((x+y),lcm(x,y))

题目链接

题意

现有$$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;
}

原文地址:https://www.cnblogs.com/kkkkahlua/p/7668986.html