GCD & LCM Inverse
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 10621   Accepted: 1939

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

POJ Achilles
 
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define S 8 ll mult(ll a,ll b,ll mod)
{
a%=mod,b%=mod;
ll ret=;
while(b)
{
if(b&)
{
ret+=a;
if(ret>=mod) ret-=mod;
}
a<<=;
if(a>=mod) a-=mod;
b>>=;
}
return ret;
}
ll pow(ll a,ll n,ll mod)
{
a=a%mod;
ll ret=;
while(n)
{
if(n&) ret=mult(ret,a,mod);
a=mult(a,a,mod);
n>>=;
}
return ret;
}
bool check(ll a,ll n,ll x,ll t)
{
ll ret=pow(a,x,n),last=ret;
for(int i=;i<=t;i++)
{
ret=mult(ret,ret,n);
if(ret== && last!= && last!=n-) return ;
last=ret;
}
if(ret!=) return ;
return ;
}
bool Miller_Rabin(ll n)
{
if(n<) return ;
if(n==) return ;
if((n&)==) return ;
ll x=n-,t=;
while((x&)==) { x>>=;t++;}
srand(time(NULL));
for(int i=;i<S;i++)
{
ll a=rand()%(n-)+;
if(check(a,n,x,t)) return ;
}
return ;
}
int tot;
ll factor[];
ll gcd(ll a,ll b)
{
ll t;
while(b)
{
t=a;
a=b;
b=t%b;
}
if(a>=) return a;
return -a;
}
ll pollard_rho(ll x,ll c)
{
ll i=,k=;
srand(time(NULL));
ll x0=rand()%(x-)+;
ll y=x0;
while()
{
i++;
x0=(mult(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d!= && d!=x) return d;
if(y==x0) return x;
if(i==k) y=x0,k+=k;
}
}
void FindFac(ll n,int k=)
{
if(n==) return;
if(Miller_Rabin(n))
{
factor[tot++]=n;
return;
}
ll p=n;
int c=k;
while(p>=n) p=pollard_rho(p,c--);
FindFac(p,k);
FindFac(n/p,k);
}
ll ansx,ansy,ans;
void dfs(int k,ll x,ll y)
{
if(k>=tot)
{
if(x+y<ans)
{
ans=x+y;
ansx=x;
ansy=y;
}
return;
}
dfs(k+,x*factor[k],y);
dfs(k+,x,y*factor[k]);
}
int main()
{
int i,j;
ll n,m;
while(scanf("%lld%lld",&m,&n)!=EOF)
{
tot=;
ans=INF; //注意初始化
FindFac(n/m,);
sort(factor,factor+tot);
for(i=j=;i<tot;i++)
{
ll tmp=factor[i];
while(i+<tot && factor[i]==factor[i+]) //注意边界
{
tmp*=factor[i];
i++;
}
factor[j++]=tmp;
}
tot=j;
dfs(,,);
if(ansx>ansy) swap(ansx,ansy);
printf("%lld %lld\n",ansx*m,ansy*m);
}
return ;
}

[POJ 2429] GCD & LCM Inverse的更多相关文章

  1. POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)

    [题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...

  2. POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)

    题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd   lcm/gcd=a/gcd*b/gcd 可知a/gc ...

  3. POJ 2429 GCD & LCM Inverse(Miller-Rabbin素性测试,Pollard rho质因子分解)

    x = lcm/gcd,假设答案为a,b,那么a*b = x且gcd(a,b) = 1,因为均值不等式所以当a越接近sqrt(x),a+b越小. x的范围是int64的,所以要用Pollard_rho ...

  4. POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)

    原题链接:http://poj.org/problem?id=2429 GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K To ...

  5. poj 2429 GCD &amp; LCM Inverse 【java】+【数学】

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9928   Accepted:  ...

  6. Mathematics:GCD & LCM Inverse(POJ 2429)

    根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...

  7. POJ2429 GCD & LCM Inverse pollard_rho大整数分解

    Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and t ...

  8. 【poj 2429】GCD & LCM Inverse (Miller-Rabin素数测试和Pollard_Rho_因数分解)

    本题涉及的算法个人无法完全理解,在此提供两个比较好的参考. 原理 (后来又看了一下,其实这篇文章问题还是有的……有时间再搜集一下资料) 代码实现 #include <algorithm> ...

  9. poj2429 GCD & LCM Inverse

    用miller_rabin 和 pollard_rho对大数因式分解,再用dfs寻找答案即可. http://poj.org/problem?id=2429 #include <cstdio&g ...

随机推荐

  1. SPI协议及其工作原理详解

    一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...

  2. 《C和指针》 读书笔记 -- 第11章 动态内存分配

    1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...

  3. MySQL中bin-log使用

    操作命令:show binlog events ; reset master 删除所有的二进制日志 flush logs 产生一个新的binlog日志文件 show master logs; 或者 s ...

  4. Nginx简单性能调优

    Nginx默认没有开启利用多核CPU (忍不住吐槽,然怪总感觉服务器性能没充分发挥), 我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU.CPU是任务处理,计算最关键 ...

  5. wancms从apache迁移至nginx

    首先解决nginx1.2不支持pathinfo问题,见上一篇博文 其次是数据库的用户名变了之后,修改各种配置,wancms的,ucenter的,bbs的 还有一个是wacms的后台站点管理里面的uc配 ...

  6. 【BZOJ 1067】 [SCOI2007]降雨量

    Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...

  7. webx学习笔记

    Webx学习笔记周建旭 2014-08-01 Webx工作流程 图 3.2. Webx Framework如何响应请求 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两 ...

  8. css3 简单界面动画

    asdasdasdasda asdasdasdasda

  9. SQL一列多行字符串分组合并

    最近工作遇到如下数据:需要合并后只剩下两行的数据,普通的group by 是不能实现的.(如图) 利用如下SQL代码,即可实现需求(如图): 利用 stuff 函数实现分拆合并操作 select Te ...

  10. 1176: [Balkan2007]Mokia - BZOJ

    Description维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 修改操作数M<=160000,询问数Q<=10000,W<=2000000.Inp ...