题意:给你两个数a,b的最大公约数和最小公倍数,求a,b。(有多组a,b的情况下取a+b最小的)
题解:令 c = a * b / gcd(a,b),对 c 因式分解
假如c = p1^k1 * p2^k2 * p3^k3
令 d1 = p1^k1, d2 = p2^k2, d3 = p3^k3
然后从d1,d2,d3中选取某几项,使得它们的积 s 最接近sqrt(c),且<=sqrt(c)
那么 a = s * gcd(a,b), b = c / s * gcd(a,b)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<algorithm>
using namespace std;#define lint __int64
lint ans[1000], cnt;
lint G, L, a, b, sq;lint gcd(lint a,lint b)
{if ( b == 0 )return a;return gcd ( b, a % b );
}lint mod_mult ( lint a, lint b, lint n )
{lint ret = 0;a = a % n;while ( b >= 1 ){if ( b & 1 ){ret += a;if ( ret >= n ) ret -= n;}a = a << 1;if ( a >= n ) a -= n;b = b >> 1;}return ret;
}lint mod_exp ( lint a, lint b, lint n )
{lint ret = 1;a = a % n;while ( b >= 1 ){if ( b & 1 )ret =  mod_mult(ret,a,n);a = mod_mult(a,a,n);b = b >> 1;}return ret;
}bool witness ( lint a, lint n )
{int i, t = 0;lint m = n - 1, x, y;while ( m % 2 == 0 ) { m >>= 1; t++; }x = mod_exp (a, m, n);for ( i = 1; i <= t; i++ ){y = mod_exp ( x, 2, n );if( y==1 && x!=1 && x!=n-1 )return true;x = y;}if ( y != 1 ) return true;return false;
}bool miller_rabin ( lint n, int times = 10 )
{if ( n == 2 ) return true;if ( n == 1 || n % 2 == 0 ) return false;srand ( time(NULL) );for ( int i = 1; i <= times; i++ ){lint a = rand() % (n-1) + 1;if ( witness(a,n) ) return false;}return true;
}lint rho ( lint n, int c )
{lint i, k, x, y, d;srand ( time(NULL) );i = 1;  k = 2;y = x = rand() % n;while ( true ){i++;x = (mod_mult(x,x,n)+c) % n;d = gcd ( y - x, n );if ( d > 1 && d < n ) return d;if ( y == x ) break;if ( i == k ) { y = x; k *= 2; }}return n;
}void pollard ( lint n, int c )
{if ( n == 1 )  return;if ( miller_rabin(n) ) { ans[cnt++] = n; return; }lint m = n;while ( m >= n )m = rho ( m, c-- );pollard ( m, c );pollard ( n / m, c );
}void choose ( lint s, lint val )
{if ( s >= cnt ){if ( val > a && val <= sq )a = val;return;}choose ( s + 1, val );choose ( s + 1, val * ans[s] );
}int main()
{while ( scanf("%I64d%I64d",&G,&L) != EOF ){if ( L == G ){printf("%I64d %I64d\n",L,G);continue;}L /= G;cnt = 0;pollard ( L, 107 );sort ( ans, ans + cnt );int i, j = 0;for ( i = 1; i < cnt; i++ ){while ( ans[i-1] == ans[i] && i < cnt )ans[j] *= ans[i++];if ( i < cnt ) ans[++j] = ans[i];}cnt = j + 1; a = 1;sq = (lint)sqrt(L+0.0);choose ( 0, 1 );printf("%I64d %I64d\n", a*G, L/a*G);}return 0;
}

POJ 2429 GCD LCM Inverse (整数分解,由gcd+lcm求a,b)相关推荐

  1. POJ2429 GCDLCM Inverse(整数分解,由GCD+LCM求a,b)

    POJ2429 GCD&LCM Inverse(整数分解,由GCD+LCM求a,b) 分类: 数论 2013-02-12 22:00  180人阅读  评论(1)  收藏  举报 题目:GCD ...

  2. GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)

    题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...

  3. POJ 2429 GCD LCM Inverse ★(pollard-ρ DFS枚举)

    题目链接:http://poj.org/problem?id=2429 题目大意:给定gcd(a,b)和lcm(a,b)(<2^63),求a和b,如果有多种情况,输出和最小的情况.   首先gc ...

  4. POJ 2429 GCD LCM Inverse

    设答案为ans1,ans2 ans1=a1*gcd,ans2=a2*gcd,a1,a2互质 gcd*a1*b1=lcm,gcd*a2*b2=lcm a1*b1=lcm=(ans1*ans2)/gcd= ...

  5. c语言判断素数squ,poj1811——Prime Test//素数判断+整数分解因子

    题意:给定N,如果N为素数,输出"Prime",否则输出其最小因子. 思路:用miller_rabin判断素数,pollardRho用于整数因子的分解.整数因子分解还有一个更快的算 ...

  6. 数论 —— 整数分解

    [概述] 整数分解目前仍是世界级难题,是非常重要的研究方向,其有很多种算法,性能上各有差异,本文仅介绍试除法.Fermat 算法.Pollard Rho 算法. [试除法] 试除法也叫穷举法,是整数分 ...

  7. 离散数学/初等数论:用“质因子分解法”和“欧几里得算法”求最大公约数gcd;“质因子分解法”和“最简算法”求最小公倍数lcm;以及对“意义”的一些看法。

    需要在开头提前说明,本篇文章仅仅用于在学习初等数论或者离散数学时候对算术基本定理的理解,实际应用的时候把结论告诉大家,想求最大公约数就用欧几里得算法是最简单的,在本篇不再赘述,有机会我会在其他文章中说 ...

  8. 大整数分解——Pollard Rho算法

    延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...

  9. VJ 1033 整数分解(版本2)

    描述 整数分解(版本2) 一个正整数可以分解成若干个自然数之和.请你编一个程序,对于给出的一个正整数n(1<=n<=1500),求出满足要求的分解方案,并使这些自然数的乘积m达到最大. 例 ...

  10. 7-37 整数分解为若干项之和(20 分)

    7-37 7-37 整数分解为若干项之和(20 分) 将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,-.编程求出正整数N的所有整数分解式子. 输入 ...

最新文章

  1. 2016c语言模拟试卷一,2016年9月计算机二级C语言考试预测试题及答案(4)
  2. 学python要有多少英语词汇量测试_“扫地僧”!自学Python编程、英语词汇量15000……北大保安再上热搜...
  3. QThreadPool Class的翻译
  4. Java使用HtmlUnit抓取js渲染页面
  5. 全国电子设计竞赛 (经验之谈)
  6. 风格迁移应用_图像风格迁移
  7. Tableau宣布退出中国市场,背后的原因细思恐极...
  8. 20145322何志威 《信息安全系统设计基础》第2周学习总结
  9. EXCEL 利用随机数公式生成随机字母、随机密码
  10. ADS1115的使用教程(IIC)
  11. C#招行支付流程(一网通支付-PC扫码支付)
  12. Laravel的ORM模型的find(),findOrFail(),first(),firstOrFail(),get(),list(),toArray()之间的区别是什么?
  13. html5制作八卦图,使用HTML+CSS画太极八卦图
  14. 每日诗词 【登徒子好色赋并序】
  15. 数位板时不时失控_当事情失控时进行网络分析
  16. 流水线中使用 docker in pod 方式构建容器镜像
  17. 串行数字接口(SDI)
  18. SEM 同台展现实例
  19. Riak Core Guide 1
  20. android打地鼠游戏

热门文章

  1. php即时聊天数据库设计入门经典教程_用PHP+MySQL搭建聊天室
  2. oracle怎么出出awr报告,如何在Oracle中生成AWR报告
  3. HTML\CSS实现静态网页附完整代码【W3school主页】
  4. 入门任务1-PPCA
  5. nacos配置中心指定配置文件为yml格式
  6. Jmeter将响应结果导出到文件
  7. .NET图表控件TeeChart for .NET使用教程:构建图表
  8. PDMan 连接数据库报spawn xxxx ENOENT
  9. 自监督学习(十)Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles
  10. 语义分割模型中分辨率恢复_语义模型在智慧工业运营中的作用