AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

最大公约数的思考与疑问



0


给定两个数的最大公约数和最小公倍数,问:这两个数的和最大和最小可能是多少?

想问下大家的想法,我感觉只能确定和的最小值,最大值是不是不能确定啊



提问于22天前
巷港
35851


2 个问答



2

分享一下我的思考,不一定对,请指正。如果我们已经知道了两个数a,b(a>0,b>0)的最大公约数为c,最小公倍数d,那么$a*b=c*d$。那么可以暴力枚举a,可以通过$a*b=c*d$算出b,在验算gcd(a, b)=c,维护一个最大值就行,但是复杂度较高。
那我们可以想,a和b的所有质因数与$c*d$的质因子一样,所以我们对$c*d$分解质因数,又因为c中的质因子在a,b中一定都出现过,所以我们对$c*d$分解质因数后的结果减去两倍的c的质因数,那么得出的这个结果中所有的质因子要么在a中出现,在b中没出现;要么在a中没出现,在b中出现。所以我们可以用贪心,现在a,b的基础都是c,我们要将刚才得到的数组中的数都累乘到a或者b上,所以我们可以将所有的数都乘到a或者b上,这样可以使a+b的结果最大。这样复杂度就降为了log(n).
// https://www.acwing.com/blog/content/34755/
#include<bits/stdc++.h>

#define fi first
#define se second
#define all(a) a.begin(), a.end()
#define pd push_back

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
typedef pair<double, double> PDD;

const int N = 2e5+10, M = N * 2, INF = 0x3f3f3f3f;

int n, m;
int c, d;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>c>>d; // c 是最大公约数,d是最小公倍数
    LL tmp = c * d;
    unordered_map<int,int> ha;
    for(int i=2;i<=tmp/i;i++){
        if(tmp%i==0){
            int s = 0;
            while(tmp%i==0) s++,tmp/=i;
            ha[i] = s;
        }
    }
    if(tmp>1) ha[tmp] ++;

    tmp = c;
    for(int i=2;i<=tmp/i;i++){
        if(c%i==0){
            int s = 0;
            while(tmp%i==0) s++,tmp/=i;
            ha[i] -= 2 * s;
        }
    }
    if(tmp>1) ha[tmp] -= 2;

    LL a = c, b = c;
    for(auto [x, y]:ha)
        if(y>0){
            for(int i=0;i<y;i++) b *= x;
        }

    cout<<a+b<<endl;
    return 0;
}
回答于21天前
啼莺修竹
20519

因为上面的解释中是将c * d并分解质因子后再减去两倍的 c 的质因子,相当于 d 直接整除 c ,c + d 中的c 是没有乘上质因子,d 是我们将质因子全部乘到 c 上,相当于 d / c * c,也就是 d。所以答案可直接写成 c + d。 –  啼莺修竹   21天前

因为上面的解释中是将c * d并分解质因子后再减去两倍的 c 的质因子,相当于 d 直接整除 c ,c + d 中的c 是没有乘上质因子,d 是我们将质因子全部乘到 c 上,相当于 d / c * c,也就是 d。所以答案可直接写成 c + d。 –  啼莺修竹   21天前

@啼莺修竹:  这个结论能证明嘛 –  巷港   21天前

sorry,其实o(1)也行,最大值就是c + d –  啼莺修竹   21天前

感觉是对的!分解最小公倍数 d 的质因数,并考虑将这些质因数乘到 a 或 b 上,以使得 a + b 的结果最大。 挺严谨的,感觉没毛病!看到了你的思路,感觉开阔了许多! –  巷港   21天前



0

有gcd和lcm可以知道ab的乘积,然后根据ab的乘积可以知道这个乘积中包含了两个gcd,用这个乘积除以两次gcd,应该可以得到一组互质的数,这组数分别*gcd就是a跟b。
但是我在考虑a和b是不是总是唯一的呢?根据我的思路的话,我们总是能根据乘积得到一个数,将这个数分解为两个互质的数,从而得到a和b…但是题目又限制了gcd的数值,所以a和b总是唯一的??

回答于21天前
__yxc_
416

@啼莺修竹:  明白了,接下来只要分解一下因子,保证这两个数互质就行,再对比一下所有的情况选出一个最优解。 谢谢! –  __yxc_   20天前

不是唯一的,因为ab的乘积减去两次gcd后得到的所有数可以随机分配给a或者b –  啼莺修竹   20天前


我来回答
你确定删除吗?

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息