GCD & LCM Inverse
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 Source |
[Submit] [Go Back] [Status] [Discuss]
题意:给你两个数的gcd和lcm,让你求这两个数
题解:我们考虑lcm/gcd,这样得出的两个数一定是互质的。
然后我们考虑分解质因数,两个互质的数一定没有公因数,因此dfs暴力其中一个数的因数即可。
数很大,无法直接暴力分解因数,这里采用Pollard-rho算法分解(不知道的自行百度)
然后怎么保证a+b最小呢,其实两个数最接近时,这两个数的和一定最小(可以证明的)。
呢我们直接dfs即可。
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<time.h>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define Mod 10007
#define maxn 50500
#define lowbit(x) (x&-x)
#define eps 1e-9
ll cnt, fat[101],mx,ans;
ll pri[2550005], a[2550005] = {1,1};
ll Multi(ll a, ll b, ll mod) //和上面一样,但比上面慢很多
{
ll ans = 0;
a %= mod;
while(b)
{
if(b%2==1) ans = (ans+a)%mod, b--;
else a = (a+a)%mod, b /= 2;
}
return ans;
}
ll Pow(ll a, ll b, ll mod)
{
ll ans = 1;
a %= mod;
while(b)
{
if(b&1) ans = Multi(ans, a, mod), b--;
else a = Multi(a, a, mod), b /= 2;
}
return ans;
}
ll Gcd(ll a, ll b)
{
if(b==0)
return a;
return Gcd(b, a%b);
}
int Miller_Rabin(ll n)
{
int i, j, k;
ll a, x, y, mod;
if(n==2) return 1;
if(n<2 || n%2==0) return 0;
k = 0, mod = n-1;
while(mod%2==0)
{
k++;
mod /= 2;
}
for(i=1;i<=15;i++)
{
a = rand()%(n-1)+1;
x = Pow(a, mod, n);
y = 0;
for(j=1;j<=k;j++)
{
y = Multi(x, x, n);
if(y==1 && x!=1 && x!=n-1)
return 0;
x = y;
}
if(y!=1)
return 0;
}
return 1;
}
ll Divi(ll n)
{
ll i, k, x, y, p, c;
if(n==1)
return 1;
k = 2, p = 1;
y = x = rand()%n, c = rand()%(n-1)+1;
for(i=1;p==1;i++)
{
x = (Multi(x, x, n)+c)%n;
p = x-y;
if(p<0)
p = -p;
p = Gcd(n, p);
if(i==k)
y = x, k *= 2;
}
return p;
}
void Pollard_rho(ll n)
{
ll p;
if(n==1)
return;
if(Miller_Rabin(n))
fat[++cnt] = n;
else
{
p = Divi(n);
Pollard_rho(p);
Pollard_rho(n/p);
}
}
void dfs(ll x,ll y)
{
if(x>cnt)
{
if(y>ans && y<=mx)
ans=y;
return;
}
dfs(x+1,y);
dfs(x+1,y*fat[x]);
}
int main(void)
{
ll a,b;
while(scanf("%lld%lld",&a,&b)!=EOF)
{
cnt=0;b=b/a;
Pollard_rho(b);
sort(fat+1,fat+cnt+1);
int i,j=1;
for(i=2;i<=cnt;i++)
{
while(fat[i]==fat[i-1] && i<=cnt)
fat[j]*=fat[i],i++;
if(i<=cnt)
fat[++j]=fat[i];
}
cnt=j;ans=1;
mx=(ll)sqrt((double)b);
dfs(1ll,1ll);
printf("%lld %lld\n",ans*a,b/ans*a);
}
return 0;
}
安装SQL SERVER 2005时出现如下错误提示:在以上提示的目录下找到文件:SQLSetup0005_K3_Core.log和SQLSetup0005_K3_Datastore.xml,打开第一个文件内容如下:Microsoft SQL Server 2005 Setup beginning at Sat Aug 13 10:09:37 2016Process ID ..._sql 0x80070643
clearInterval()方法能够取消setInterval()方法设置的定时器,本文给大家详解clearInterval()方法的定义和用法,感兴趣的朋友参考下。此方法能够取消setInterval()方法设置的定时器。此方法的参数必须是要取消相应的setInerval()方法的返回值。点击可参阅更多window对象的属性和方法。语法结构:_clearinterval
erp系统需要服务器配置 内容精选换一换简要介绍SAMtools是一组实用程序,用于与Heng Li编写的SAM,BAM和CRAM格式的短DNA序列读取比对进行交互并进行后处理。这些文件是由短读取对齐器(如BWA)作为输出生成的。提供了简单和高级工具,支持复杂任务,例如变体调用和对齐查看以及分类,索引,数据提取和格式转换。开发语言:C一句话描述:操作SAM和BAM文件的工具集合在SAP HANA系..._erp服务器配置
<body> <h2>用户信息表</h2> <table border="1"> <tr> <td>张三</td> <td>23</td> <td>上海</td> </tr>..._a-table使用rowspan合并单元格后多出一行
这里以Windows+Java+Tomcat+MySQL环境搭建为例:一、配置Java环境:下载安装JDK 官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html安装教程:https://jingyan.baidu.com/a..._本地搭建测试环境
数据库类:\libs\classes\database\mysqlquery.php$row = $db->select('ms.,m.')->from('#__msession ms, #__members m') ->where('ms.mid = m.mid') ->_and(array('ms.msid'=> 'dzIB3C')) ->_and(array('m.passwor
英伟达Jetson TX2 默认只打开了一个USB3.0接口,而我们项目需要两个USB3.0接口,同时保留2lane PCIE 接三星 SSD M.2固态硬盘。需要更改默认配置7.1 USB3.0 引脚定义Jetson_TX2_TX2i_Module_DataSheet_v01.pdf文件中定义的USB3.0 引脚定义Jetson-TX2-Generic-Customer..._英伟达p3310
“目前是市场出清的攻坚期,等出清完成后,存活下来的平台还要接受一段时间的监测,之后才可能考虑备案。目前备案的条件、规则、流程及时间表等都还没有定下来。”一位华北P2P网贷研究人士表示。 “现在谈备案为时尚早,预计2019年年底能把备案规则制定出来,2020年能够真正落地就不错了。”另一位业内人士也表达了类似观点。事实上,P2P网贷行业的专项整...
个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,结果为空时也会返回一个空集合而不是null。那么这样有什么好处呢?最大的好处就是调用方不用在判断是否为null,可以直接用,因为不用抛空指针。当然这也有缺点,如果返回Lists.newArrayList();或者new ArrayList();这会新建一个对象,而这个对象很可能是没必要的,这样白白浪费性能...
本文记录最常见的基于图搜索的A*算法的原理和代码实现效果。由于A*算法是在Dijkstra算法基础上加入了“贪心”的启发式函数,所以会先顺带介绍下Dijkstra算法。1. Dijkstra算法和A*算法流程便于理解,先上算法伪代码流程,针对流程逐一介绍第1步:创建一个优先级队列(也叫 open list),用于存储所有需要被扩展的节点,这个优先级队列中节点以到起始点的路径代价g(n)进行排序;第2步:讲起始点放入优先级队列中,令起始节点g值为0,图中其他节点g值为无穷大;第3步:进入循环,进行_深蓝学院a*运动规划课程代码
关于Hook 一、基本概念: 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,
我是用来移动图片的,其他格式的文档也是可以的,改下后缀列表就可以了import os,shutilimport datetime#将文件夹里的图片全部移动到新文件夹中#revised by Stephen Shen 2020-3-10 09:28:50def renameFile(dstpath):fdirname,fbasename=os.path.split(dstpath)#文件名相同但大小..._python怎么将文件批量移动 csdn