POJ 2429 GCD & LCM Inverse(Pollard-rho 大整数分解+DFS)_信仰..的博客-程序员宅基地

技术标签: dfs  数论  

GCD & LCM Inverse
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 16795   Accepted: 3107

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]

Home Page   Go Back  To top


题意:给你两个数的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;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/haut_ykc/article/details/78172569

智能推荐

SQL SEVER 安装出错:Error Code: 0x80070643 (1603)_weixin_34100227的博客-程序员宅基地

安装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

js clearInterval()方法的定义和用法_Ron_Miu的博客-程序员宅基地

clearInterval()方法能够取消setInterval()方法设置的定时器,本文给大家详解clearInterval()方法的定义和用法,感兴趣的朋友参考下。此方法能够取消setInterval()方法设置的定时器。此方法的参数必须是要取消相应的setInerval()方法的返回值。点击可参阅更多window对象的属性和方法。语法结构:_clearinterval

erp系统 服务器配置,erp系统需要服务器配置_Up酱彡的博客-程序员宅基地

erp系统需要服务器配置 内容精选换一换简要介绍SAMtools是一组实用程序,用于与Heng Li编写的SAM,BAM和CRAM格式的短DNA序列读取比对进行交互并进行后处理。这些文件是由短读取对齐器(如BWA)作为输出生成的。提供了简单和高级工具,支持复杂任务,例如变体调用和对齐查看以及分类,索引,数据提取和格式转换。开发语言:C一句话描述:操作SAM和BAM文件的工具集合在SAP HANA系..._erp服务器配置

HTML 表格合并(表格合并行属性 rowspan 将多行合并成一行)_a-table使用rowspan合并单元格后多出一行_李欣梦的博客-程序员宅基地

<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..._本地搭建测试环境

08CMS之数据库操作_qq_37815750的博客-程序员宅基地

数据库类:\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_英伟达p3310_du2005023029的博客-程序员宅基地

英伟达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:备案重启还要多久? _weixin_34220179的博客-程序员宅基地

“目前是市场出清的攻坚期,等出清完成后,存活下来的平台还要接受一段时间的监测,之后才可能考虑备案。目前备案的条件、规则、流程及时间表等都还没有定下来。”一位华北P2P网贷研究人士表示。 “现在谈备案为时尚早,预计2019年年底能把备案规则制定出来,2020年能够真正落地就不错了。”另一位业内人士也表达了类似观点。事实上,P2P网贷行业的专项整...

java 返回null或空_java返回集合为null还是空集合_Filge的博客-程序员宅基地

个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,结果为空时也会返回一个空集合而不是null。那么这样有什么好处呢?最大的好处就是调用方不用在判断是否为null,可以直接用,因为不用抛空指针。当然这也有缺点,如果返回Lists.newArrayList();或者new ArrayList();这会新建一个对象,而这个对象很可能是没必要的,这样白白浪费性能...

A*算法笔记及C++实现_深蓝学院a*运动规划课程代码_安安的胖胖的博客-程序员宅基地

本文记录最常见的基于图搜索的A*算法的原理和代码实现效果。由于A*算法是在Dijkstra算法基础上加入了“贪心”的启发式函数,所以会先顺带介绍下Dijkstra算法。1. Dijkstra算法和A*算法流程便于理解,先上算法伪代码流程,针对流程逐一介绍第1步:创建一个优先级队列(也叫 open list),用于存储所有需要被扩展的节点,这个优先级队列中节点以到起始点的路径代价g(n)进行排序;第2步:讲起始点放入优先级队列中,令起始节点g值为0,图中其他节点g值为无穷大;第3步:进入循环,进行_深蓝学院a*运动规划课程代码

window系统HOOK学习_lixingshi的博客-程序员宅基地

关于Hook 一、基本概念: 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,

python怎么批量移动文件_用python批量移动文件_何谨的博客-程序员宅基地

我是用来移动图片的,其他格式的文档也是可以的,改下后缀列表就可以了import os,shutilimport datetime#将文件夹里的图片全部移动到新文件夹中#revised by Stephen Shen 2020-3-10 09:28:50def renameFile(dstpath):fdirname,fbasename=os.path.split(dstpath)#文件名相同但大小..._python怎么将文件批量移动 csdn

推荐文章

热门文章

相关标签