SRM遇到的一个数论技巧——最大公约数和最小公倍数的关系
2012-03-26 23:51
316 查看
最大公约数L和最小公倍数G的关系:
1、L%G == 0;
2、设A, B的最大公约数为G, 最小公倍数为L,则:
L/G = (A/G)*(B/G)
3、gcd(A/G, B/G) = 1;
题目:给出一对数A, B 的最大公约数G, 最小公倍数L。这里A, B有多种组合。,求A,B的一种组合使得A + B最小。如果没有则输出-1(SRM535 div2 500pt)
(G <= 10^12, L<=10^12)
猛的一看数据很大。不过用上前边的定理就可以解决了。
领X = L/G;
枚举A/G的值(不超过sqrt(X)),得到B/G的值。判断是否满足定理3。在所有满足的情况中找最小的ans = min(ans, (A/G + B/G))。最后结果为ans*G
代码:
1、L%G == 0;
2、设A, B的最大公约数为G, 最小公倍数为L,则:
L/G = (A/G)*(B/G)
3、gcd(A/G, B/G) = 1;
题目:给出一对数A, B 的最大公约数G, 最小公倍数L。这里A, B有多种组合。,求A,B的一种组合使得A + B最小。如果没有则输出-1(SRM535 div2 500pt)
(G <= 10^12, L<=10^12)
猛的一看数据很大。不过用上前边的定理就可以解决了。
领X = L/G;
枚举A/G的值(不超过sqrt(X)),得到B/G的值。判断是否满足定理3。在所有满足的情况中找最小的ans = min(ans, (A/G + B/G))。最后结果为ans*G
代码:
#include <vector> #include <list> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; class FoxAndGCDLCM { public: long long gcd(long long a, long long b) { if(b == 0) return a; return gcd(b, a%b); } long long get(long long G, long long L) { if(L%G) return -1; long long i, x = L/G; long long ans = L; for(i = 1; i*i <= x; ++i) { if(x%i) continue; if(gcd(i, x/i) == 1) { ans = min(ans, i + x/i); } } return ans*G; } }; //Powered by KawigiEdit 2.1.8 (beta) modified by pivanof!
相关文章推荐
- 最大公约数和最小公倍数的关系
- 数论继续学习3--最大公约数gcd和最小公倍数lcm
- ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄))
- uva 11388 最大公约数与最小公倍数的关系
- 2013年通化邀请赛E题(GCD and LCM 最大公约数最小公倍数关系 )
- 我遇到的最优的最大公约数与最小公倍数的算法
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- 编写方法,输入两个正整数m和n,求其最大公约数和最小公倍数 。
- 习题 5.3 输入两个正整数m和n,求其最大公约数和最小公倍数。
- 最大公约数与最小公倍数简单代码
- 最小公倍数和最大公约数
- 最大公约数与最小公倍数
- 输入两个正整数m和n,求其最大公约数和最小公倍数
- c++实验7--最大公约和和最小公倍数
- 最大公约数最小公倍数
- 最小公倍数和最大公约数的三种算法
- 最大公约最小公倍数
- Java求两个数的最大公约数最小公倍数
- sdut_java_C/C++训练1---最大公约数与最小公倍数
- 第十八周 【OJ问题 A: C++实验——最小公倍数和最大公约数】