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

题目链接

题意

现有\[x+y=a\\lcm(x,y)=b\]找出满足条件的正整数\(x,y\).

\(a\leq 2e5,b\leq 1e9,数据组数12W\).

思路

结论

\(gcd(x,y)=gcd((x+y),lcm(x,y))\)

证明

先证\(gcd(x,y)|gcd((x+y),lcm(x,y))\)

不妨设\(gcd(x,y)=k\),则有\(k\mid x,k\mid y\),则有\(k\mid (x+y)\) …①

\(k\mid x,x\mid lcm(x,y)\),所以\(k\mid lcm(x,y)\) …②

综合①②有\(k\mid 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\nmid x\),则有\(k_0\nmid y\),否则\(k_0\nmid (x+y)\).

而若\(k_0\nmid x,k_0\nmid y\),则\(\exists d1,d1\mid k_0,d1\nmid x;\exists d2,d2\mid k_0,d2\nmid y\).而\(\forall d\mid lcm(x,y),有d\mid x或d\mid 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\n"); return; }
    LL ssqrt = sqrt(delta);
    if (ssqrt*ssqrt != delta) { printf("No Solution\n"); return; }
    LL den = a+ssqrt;
    if (den&1) { printf("No Solution\n"); return; }
    LL x = den/2;
    LL y = a-x;
    if (x > y) swap(x, y);
    printf("%lld %lld\n", x, y);
}
int main() {
    while (scanf("%lld%lld", &a, &b) != EOF) work();
    return 0;
}

转载于:https://www.cnblogs.com/kkkkahlua/p/7668986.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值