SRM遇到的一个数论技巧——最大公约数和最小公倍数的关系
最大公约数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 #include <vector> 2 #include <list> 3 #include <map> 4 #include <set> 5 #include <queue> 6 #include <deque> 7 #include <stack> 8 #include <bitset> 9 #include <algorithm>10 #include <functional>11 #include <numeric>12 #include <utility>13 #include <sstream>14 #include <iostream>15 #include <iomanip>16 #include <cstdio>17 #include <cmath>18 #include <cstdlib>19 #include <ctime>20 21 using namespace std;22 23 24 class FoxAndGCDLCM {25 public:26 long long gcd(long long a, long long b) {27 if(b == 0) return a;28 return gcd(b, a%b);29 }30 31 long long get(long long G, long long L) {32 33 if(L%G) return -1;34 long long i, x = L/G;35 long long ans = L;36 37 for(i = 1; i*i <= x; ++i) {38 if(x%i) continue;39 if(gcd(i, x/i) == 1) {40 ans = min(ans, i + x/i);41 }42 }43 return ans*G;44 }45 };46 47 48 49 //Powered by KawigiEdit 2.1.8 (beta) modified by pivanof!
SRM遇到的一个数论技巧——最大公约数和最小公倍数的关系相关推荐
- 数论:最大公约数与最小公倍数的应用:最大公约数和最小公倍数问题
总结: 参考文献:https://sochiji.blog.luogu.org/solution-p1029 1.a * b == (a,b) * [a,b] (a,b的最大公约数 * a,b的最小公 ...
- 第十二单元 数论算法12.1 同余的性质12.2 最大公约数、最小公倍数
第十二单元 数论算法 12.1 同余的性质! 注意下面三个式子,它可以保证在计算中不会发生溢出. (a+b) mod m=(a mod m+b mod m) mod m (a-b) mod m ...
- python之逆解最大公约数与最小公倍数
1.贴题 题目来自PythonTip 逆解最大公约数与最小公倍数 我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数.今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公 ...
- 求解最大公约数以及最小公倍数
最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积. 本质上求最小公倍数就是求最大公倍数:x=m*a, y=m*b:m是最大 ...
- C++算法:三种方法求最大公约数和最小公倍数
三种方法求最大公约数和最小公倍数标题 首先明确最大公约数和最小公倍数的关系,设两个数为a,b:最大公约数为c,最大公倍数为d: 则ab=cd;怎么得到的可以通过数学算式证明. 分别用暴力搜索法,辗转相 ...
- 16.求两个数的最大公约数和最小公倍数
#include <stdio.h>//求m,n的最大公约数和最小公倍数 //利用辗除法,又叫做欧几里得算法,是用来求最大公约数的方法 //最大公约数 * 最小公倍数 = a * b in ...
- C语言最大公约数和最小公倍数(辗转相除法)
从键盘输入两个正整数 a 和 b,求其最大公约数和最小公倍数. 算法思想 利用格式输入语句将输入的两个数分别赋给 a 和 b,然后判断 a 和 b 的关系,如果 a 小于 b,则利用中间变量 t 将其 ...
- C语言_算法_输入两个正整数m和n,求其最大公约数与最小公倍数
(1)方式一:碾转相除法 #include <stdio.h> #include <math.h> /*输入两个数,求最大公约数 与最小公倍数分析关系:最小公倍数=两数的积/最 ...
- Oracle中删除数据的一个小技巧
在我带的某个Project中,在开发阶段需要Reload相同的Data到Oracle中来进行测试,因此需要不断的删除数据,简单的Delete操作似乎就OK了,但其实不然.我们到知道建表的时候需要Tab ...
最新文章
- input python2.7_python 中的input
- 为什么只有奇次谐波_治理变频器产生谐波的应用
- JavaWeb-RESTful_用SpringMVC开发RESTful
- php post aspx,PHP模拟POST aspx页面不成功
- tesseract linux 训练
- ios9 字符串与UTF-8 互相转换
- Lua中的协同程序 coroutine
- 1434 区间LCM
- Coding the Matrix Week 1 The Vector Space作业
- 本周小结!(二叉树系列三)
- 【GIS教程】土地利用转移矩阵
- speex java_(原创)speex与wav格式音频文件的互相转换(二)
- es6中 使用class里面的set和get 用法
- SQlserver基础学习
- Swagger2学习笔记
- 看看英特尔安全(迈克菲)的自适应防御体系
- GlusterFS——分布式复制卷
- Arduino UNO跑FreeRTOS操作系统
- 游戏脚本代码大全_代码与程序的关系是这样的
- HTML 前端 flex宫格布局