\(\\\)

\(Description\)


给出两数的\(GCD\)和\(LCM\),求合法的两数之差的绝对值最小是多少。

  • \(GCD\times LCM\le10^{18}\)

\(\\\)

\(Solution\)


多解的有趣小水题。

\(\\\)

解法一:求出\(GCD\times LCM\),我们知道这个就等于两数之积,考虑枚举其中的一个数。

考虑枚举的数一定是\(GCD\)的倍数,所以直接枚举就好,我们只需要处理枚举的数小于另一个数的情况,最后将所有算出来的答案取\(min\) 即可,复杂度 \(\text O(\sqrt{LCM})\)。

\(\\\)

解法二:\(\frac{LCM}{GCD}=\frac A{GCD}\times \frac B{GCD}\)枚举第二个式子左半部分,乘上更新答案。复杂度\(\text O(\sqrt{\frac{LCM}{GCD}})\)

\(\\\)

解法三:还是上面的式子。考虑当\(\frac A{GCD}\)和\(\frac B{GCD}\)最接近的时候产生的差值最小所以直接从\(\sqrt{\frac{LCM}{GCD}}\)处开始枚举第一个遇见的答案一定是最优秀的。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define R register
using namespace std;
typedef long long ll; ll a,b,ans=900000000000000ll; inline ll gcd(ll x,ll y){return y?gcd(y,x%y):x;} int main(){
scanf("%lld%lld",&a,&b);
b*=a;
for(R ll i=a,j;i<=b;i+=a){
if(b%i!=0) continue;
j=b/i; if(i>j) break;
if(gcd(i,j)==a) ans=min(ans,j-i);
}
printf("%lld\n",ans);
return 0;
}

最新文章

  1. 【python】函数
  2. 数据bus
  3. C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler
  4. NET WebApi OWIN 实现 OAuth 2.0
  5. 03SpringMvc_自定义的spring.xml配置文件和逻辑视图名
  6. 安装phpunit
  7. HubbleDotNet 学习之路
  8. WinForm自定义验证控件
  9. Zend Studio 如何配置本地apache服务器使用xdebug调试php脚本
  10. awk 工具简介NF-NR
  11. Exams
  12. 关于bootstrap原理及优缺点
  13. C语言实现printf的基本格式输出%d,%c,%p,%s
  14. SSRS分页
  15. Linux系统将服务器时间与网络时间同步
  16. Python进阶【第五篇】函数式编程及某些特殊函数
  17. git如何跨分支查找某个commit所属分支?
  18. (转)win7批量创建用户
  19. BST树、B树、B+树、B*树
  20. linux之 ssh连接服务器,WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

热门文章

  1. Spring Cloud体系实现标签路由
  2. 对于事务ACID的理解
  3. openstack setup demo Image service
  4. 007 Vlan config
  5. web网站架构演变过程
  6. Hiho1041 国庆出游 搜索题解
  7. js 对有“命名空间”的表单做深度解析
  8. 十分简便的APK反编译(Mac 版本号 具体解释)
  9. 【bzoj3124】[Sdoi2013]直径
  10. jvm实例的个数