找回密码
 欢迎注册
查看: 13519|回复: 15

[求助] GCD & LCM Inverse

[复制链接]
发表于 2008-8-1 00:18:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
Description

Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b. But what about the inverse? That is: given GCD and LCM, finding a and b.
Input

The input contains multiple test cases, each of which contains two positive integers, the GCD and the LCM. You can assume that these two numbers are both less than 2^63.
Output

For each test case, output a and b in ascending order. If there are multiple solutions, output the pair with smallest a + b.
Sample Input

3 60
Sample Output

12 15

原题出自http://acm.pku.edu.cn/JudgeOnline/problem?id=2429
发现这里都是大牛,这个会不会太简单了呀,,不要鄙视我T_T,偶刚搞ACM不久~~
已知a,b的最大公约数GCD和最小公倍数LCM,如何求a,b?如有多组解,则输出a+b和为最小的那组解,限定时间在2S内,由于给出的数值范围达到64位,基本方法是先将LCM/GCD,再把该值拿去分解成两数相乘,可是我写的总是超时,我是先通随机算法判断出LCM/GCD是否为素数,如是则直接判断出答案,否则还是要把LCM/GCD拿去分解,不知有没有什么好的算法。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 01:32:38 | 显示全部楼层
n1=3;  //GCD
n2=60; //LCM

n1*x*y=n2;
->x*y=n2/n1;

分解n2/n1为x,y. 约束条件 GCD(x,y)=1; GCD(x,n1)=1; GCD(y,n1)=1;
a=n1*x;
b=n1*y;

此题关键是将一个数分解成为2个数的乘积,且分解后的两个数互质。
未经详细分析,不知道我说的是否正确。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-8-1 07:51:44 | 显示全部楼层
嗯,的确如此,但由于sqrt(LCM/GCD)可能达到2^32,如何高效分解,是个问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-8-1 07:57:46 | 显示全部楼层
如若从i <- sqrt(LCM/GCD)  to 1逐个遍历,得到的第一组不相等的可行解,应该就是答案,但这样速度远远达不到2S之内的要求
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 08:24:34 | 显示全部楼层
主要就是因子分解问题,小因子可以采用试除的方法,而是否素数可以采用素数测试.但是如果含有两个大因子,还是比较难的,看来你需要学习一下二次筛选法等比较高级一点的因子分解方法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-8-1 08:53:24 | 显示全部楼层
在google上查了一下,貌似很难找到相关文档,不知哪里有相关的学习资料
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 09:02:29 | 显示全部楼层
你在论坛里面找一找,无心人应该找到不少因子分解方面的程序,很多都是带源代码的。(当然这些代码会很复杂)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 09:03:27 | 显示全部楼层
还有The Art of Computer Programming里面也介绍了几种因子分解方法,对付这个题目应该可以了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 09:37:59 | 显示全部楼层
这个还是用费马分解算法吧
另外,暴力分解也能在2s内完成吧

考虑用6k + 1, 6k + 5的整数除
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-1 09:52:58 | 显示全部楼层
暴力分解可能有点问题,因为我们需要计算$2^32$以内的所有素数,这个就有点问题。还有通常使用的测试数据应该不只有一组。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-3 12:05 , Processed in 0.056265 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表