已知gcd和lcm求a+b最小和?------数论
题意
给出2个数a,b的 gcd(最大公约数n) 和 lcm(最小公倍数m),求所有符合条件的a,b中, 的最小
值。
思路
暴力枚举。根据 gcd(a,b)lcm(a,b)=ab 我们可以得到 ab的值,不妨假设a<b ,那么我们可以在[1,a∗b][1,\sqrt{a*b}] [1,a∗b]
区间 内枚举a 的取值,再根据ab 计算出b的值,验证是否满足gcd和lcm约束,即可找
到所有可能的(a,b) 取值。然后考虑题目要求是找出a+b 的最小值,既然a*b 的值是固定的,那么a
和b 的差值越小a+b 的值也就越小,因此我们可以逆序枚举 a的值,找到的第一个满足条件的(a,b) 时即为正确答案。最后考虑进行一点点优化,由于gcd(a,b)=n 那么a 一定是 n的整数倍,因此我们只需要
枚举区间内 n的整数倍的值即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll Gcd(ll a,ll b){return b==0?a:Gcd(b,a%b);}
int main()
{ll gcd,lcm,a,b,x;
int t;
cin>>t;
while(t--)
{cin>>gcd>>lcm;
x=gcd*lcm;
a=sqrt(x);
a=a-a%gcd; //快速找出从 a~1 中为 gcd 的倍数的数
while(1)
{if(x%a==0)
{b=x/a; //满足 a*b = lcm;
if(Gcd(a,b)==gcd) break; //那么只要这两个数满足 (a,b)=gcd 就找到了
}
a-=gcd; //否则减去 gcd
}
cout<<a+b<<endl;
}
return 0;
}
那么我们可不可以继续优化呢?答案是可以!
思路:
已知最大公因数为g,最小公倍数为l,那么两个数可设为x * g和y * g,又因为两个数的乘积==g*l,即x * y == l/g,求最小和即求最小的x+y,问题转换为了:在x和y互质的情况下已知x * y,求x+y的最小值为多少,此时枚举1-sqrt(x * y)的值即可。
note:
注意不要忘记x和y一定要互质,这样才能保证g仍然是最大公因数。
意思是:
LCM比GCD多的因子进行适当分配就可以使B-A最小
所以就应该把LCM÷GCD的值分解质因数(LCM/GCD可求得LCM比GCD多的因子)
代码:
while (cin >> t){while (t--){ll l, g, k, res = INF;cin >> g >> l;k = l / g;//k = x+y//只需要枚举L/G的约数,枚举的一个x在a中,那么另一个(L/G)/x就是在b中,for (int x = 1; x <= sqrt(k); x++) //这一步是将k分解质因子if (k % x == 0 && gcd(x, k / x) == 1)// 因为要保证 x *y=k的前提下,两个数互素res = min(res, x + k / x); //取最小的cout << res * g << endl; //因为后面 a+b =g(x,k/x) .因为g是a,b的最大公因数} //所以肯定含有g,又因为最大公倍数有比g多的因子,且不相同(相同的被g拿去了)}
已知gcd和lcm求a+b最小和?------数论相关推荐
- arcgis已知两点投影坐标求距离
问题: 已知中心点坐标,求个点与中心点坐标的距离 解决方法如下: 新建字段 在新建字段上右键字段计算器 利用字段计算器进行两点间距离计算 不懂问题请进群交流询问相关知识点
- 已知网络号如何求子网掩码?
已知网络号如何求子网掩码? (2012-06-14 15:16:06)转载▼ IP地址常采用点分十进制表示方法:X.Y.Y.Y,在这里,X=1–126时称为A类地址; X=128–191时成为B类地址 ...
- 【运筹学】对偶理论 : 互补松弛定理应用 ( 原问题与对偶问题标准形式 | 已知原问题最优解求对偶问题最优解 | 使用单纯形法求解 | 使用互补松弛定理公式一求解 | 互补松弛定理公式二无效 ) ★★
文章目录 一.原问题与对偶问题标准形式 二.互补松弛定理 三.已知原问题最优解求对偶问题最优解 四.使用单纯形法求解 五.使用互补松弛定理公式一求解 六.使用互补松弛定理公式二求解 ( 无效方法 ) ...
- matlab已知三点求夹角,已知3点如何求其中两点对第3点的夹角
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:已知3点如何求其中两点对第3点的夹角? 问题详情:有3个问题:1)已知3点如何求其中两点对第3点的夹角?2)如何回答:1)已知3点求 ...
- c语言已知加速度求位移速度,已知初速度,加速度,时间,求位移
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:已知初速度,加速度,时间,求位移回答:其实你套公式即可.先说第一问,用公式S=vt+1/2*at^2 初速度已知为10,即V为10, ...
- 数学 - 已知三角形三边长度求面积
数学 - 已知三角形三边长度求面积 重要提示 本文仅适合电脑及部分平板阅读,手机使用者请尽早退出,谢谢! 前言 难得有点时间来写文章,正好今天(2022/9/30)算了这个公式,就把它记录下来 另外, ...
- matlab求球心坐标,已知四顶点坐标求四面体外接球球心坐标
最近在做一个关于机器人标定的问题,发现求空间一点相对六轴机器人的坐标问题实际是一个求已知四顶点坐标求四面体外接球球心坐标的问题.首先控制机器人(携带工具)以四个不同姿态接触被测点,要注意四个姿态要保证 ...
- 已知矩形面积,求最小周长
1283 最小周长 1.0 秒 131,072.0 KB 20 分 初学者3级题 一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 2 ...
- **python入门实战**-已知圆的半径求周长面积
python入门实战-已知圆的半径求周长面积 输入半径计算圆的周长和面积 这边的知识点:调用math库里面的π值,以及数据类型. 下面展示一些 代码. import math p=math.pi a= ...
最新文章
- 互联网协议 — IPSec 安全隧道协议 — NAT-T
- “A and B ...”,谓语动词必以复数形式呈现?
- Leetcode: Validate Binary Search Tree
- 从没想过会有一个这样的机会|大疆招聘
- Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方法
- java中数据类型转换、ASCII编码
- c++不好可以学qt吗_普通人可以学Python吗
- 【springboot】application.yml配置文件中数据库密码password加密后显示
- Spring:自动装配模式
- steam快速换号工具易语言源码 附成品
- 基于深度学习的银行卡号识别 卡号识别和分割
- react 类暴露_React 组件暴露自身 API 的方法
- this的理解 转https://www.cnblogs.com/pssp/p/5216085.html#!comments
- CTF--PWN必备技能--理解c程序从编译开始到运行结束的过程
- 苹果自带的APP下载分析统计工具
- 乡村老师网络计算机培训日志,乡村年轻女教师 “教育日记”火爆网络
- 35家网络广告代理公司调查及服务水平排行榜
- 一个80年小子的创业道理,和所有准备创业或者正在创业的兄弟们共享
- Shader各种效果
- 服务器装系统后不能开机黑屏,u盘装系统后系统一直黑屏不能开机怎么回事
热门文章
- iis8 php mysql_windows2012下 iis8+php5.2+mysql5 配置
- C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)
- python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
- python 怎么安装opencv?
- linux——shell 中常用的控制语句 for、while、if、case、expect、exit、break、continue
- 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)
- Ubuntu16.04下创建工作空间并添加自己的功能包(python代码)
- pidstat 命令查看某个进程的CPU、内存、磁盘使用情况
- Elasticsearch Pipeline Aggregation管道聚合详解
- nessus导出报告格式有哪些_高分高能 | 文献检索硬核知识报告