思路:a/n*b/n=lcm/gcd 所以这道题就是分解ans.dfs枚举每种素数情况。套Miller_Rabin和pollard_rho模板

  1. //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<queue>
  7. #include<stack>
  8. #include<cmath>
  9. #include<set>
  10. #include<algorithm>
  11. #include<vector>
  12. // #include<malloc.h>
  13. using namespace std;
  14. #define clc(a,b) memset(a,b,sizeof(a))
  15. #define inf (LL)1<<61
  16. #define LL long long
  17. const double eps = 1e-;
  18. const double pi = acos(-);
  19. // inline int r(){
  20. // int x=0,f=1;char ch=getchar();
  21. // while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
  22. // while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  23. // return x*f;
  24. // }
  25. const int Times = ;
  26. const int N = ;
  27.  
  28. LL n, m, ct, cnt;
  29. LL minn, mina, minb, ans;
  30. LL fac[N], num[N];
  31.  
  32. LL gcd(LL a, LL b)
  33. {
  34. return b? gcd(b, a % b) : a;
  35. }
  36.  
  37. LL multi(LL a, LL b, LL m)
  38. {
  39. LL ans = ;
  40. a %= m;
  41. while(b)
  42. {
  43. if(b & )
  44. {
  45. ans = (ans + a) % m;
  46. b--;
  47. }
  48. b >>= ;
  49. a = (a + a) % m;
  50. }
  51. return ans;
  52. }
  53.  
  54. LL quick_mod(LL a, LL b, LL m)
  55. {
  56. LL ans = ;
  57. a %= m;
  58. while(b)
  59. {
  60. if(b & )
  61. {
  62. ans = multi(ans, a, m);
  63. b--;
  64. }
  65. b >>= ;
  66. a = multi(a, a, m);
  67. }
  68. return ans;
  69. }
  70.  
  71. bool Miller_Rabin(LL n)
  72. {
  73. if(n == ) return true;
  74. if(n < || !(n & )) return false;
  75. LL m = n - ;
  76. int k = ;
  77. while((m & ) == )
  78. {
  79. k++;
  80. m >>= ;
  81. }
  82. for(int i=; i<Times; i++)
  83. {
  84. LL a = rand() % (n - ) + ;
  85. LL x = quick_mod(a, m, n);
  86. LL y = ;
  87. for(int j=; j<k; j++)
  88. {
  89. y = multi(x, x, n);
  90. if(y == && x != && x != n - ) return false;
  91. x = y;
  92. }
  93. if(y != ) return false;
  94. }
  95. return true;
  96. }
  97.  
  98. LL pollard_rho(LL n, LL c)
  99. {
  100. LL i = , k = ;
  101. LL x = rand() % (n - ) + ;
  102. LL y = x;
  103. while(true)
  104. {
  105. i++;
  106. x = (multi(x, x, n) + c) % n;
  107. LL d = gcd((y - x + n) % n, n);
  108. if( < d && d < n) return d;
  109. if(y == x) return n;
  110. if(i == k)
  111. {
  112. y = x;
  113. k <<= ;
  114. }
  115. }
  116. }
  117.  
  118. void find(LL n, int c)
  119. {
  120. if(n == ) return;
  121. if(Miller_Rabin(n))
  122. {
  123. fac[ct++] = n;
  124. return ;
  125. }
  126. LL p = n;
  127. LL k = c;
  128. while(p >= n) p = pollard_rho(p, c--);
  129. find(p, k);
  130. find(n / p, k);
  131. }
  132.  
  133. void dfs(LL dept, LL tem=)
  134. {
  135. if(dept == cnt)
  136. {
  137. LL a = tem;
  138. LL b = ans / a;
  139. if(gcd(a, b) == )
  140. {
  141. a *= n;
  142. b *= n;
  143. if(a + b < minn)
  144. {
  145. minn = a + b;
  146. mina = a;
  147. minb = b;
  148. }
  149. }
  150. return ;
  151. }
  152. for(int i=; i<=num[dept]; i++)
  153. {
  154. if(tem > minn) return;
  155. dfs(dept + , tem);
  156. tem *= fac[dept];
  157. }
  158. }
  159.  
  160. int main()
  161. {
  162. while(~scanf("%llu %llu", &n, &m))
  163. {
  164. if(n == m)
  165. {
  166. printf("%llu %llu\n",n,m);
  167. continue;
  168. }
  169. minn = inf;
  170. ct = cnt = ;
  171. ans = m / n;
  172. find(ans, );
  173. sort(fac, fac + ct);
  174. num[] = ;
  175. int k = ;
  176. for(int i=; i<ct; i++)
  177. {
  178. if(fac[i] == fac[i-])
  179. ++num[k-];
  180. else
  181. {
  182. num[k] = ;
  183. fac[k++] = fac[i];
  184. }
  185. }
  186. cnt = k;
  187. dfs(, );
  188. if(mina > minb) swap(mina, minb);
  189. printf("%llu %llu\n",mina, minb);
  190. }
  191. return ;
  192. }

POJ 2429的更多相关文章

  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

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

  3. POJ 2429 long long 质因数分解

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

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

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

  5. 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 ...

  6. poj 2429 Pollard_rho大数分解

    先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小. 这里能够直接搜索,注意一个问题,因为同样因子不能分配给两边(会改变gcd)所以能够将同样因子合并,这种话,搜 ...

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

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

  8. 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 ...

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

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

随机推荐

  1. 优化SQL Server数据库查询方法

    SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...

  2. PAT-乙级-1032. 挖掘机技术哪家强(20)

    1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...

  3. zoj 3720

    为什么注释掉的地方是错的?  自己的代码好糟烂..... 直接枚举点  判是否在多边形内  加起来求概率    求面积的时候代码写搓了....     比不过别人两行的代码    而且到现在还找不到错 ...

  4. POJ 1850 Code(组合数)

    http://poj.org/problem?id=1850 题意 :给定字符串,系统是用字符串组成的,字符串是按字典序排的.编码系统有三条规则,1这些的单词的长度是由小到大的,2相同长度的按字母在字 ...

  5. Servlet课程0424(一) 通过实现Servlet接口来开发Servlet

    //这是我的第一个Servlet,使用实现Servlet接口的方式来开发 package com.tsinghua; import javax.servlet.*; import java.io.*; ...

  6. Android性能优化典范 - 第2季

    Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...

  7. 简单的神经元算法实现(python)

    参考python代码如下 #perceptron x=[[1 ,0, 0],[1,0,1],[1, 1, 0],[1, 1, 1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]] y ...

  8. node.js模块之fs文件系统

    fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 POSIX 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本, 例如读取文件内 ...

  9. netty 实现socket服务端编写

    import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe ...

  10. CentOS 6.4 编译安装Mysql 5.6.14

    概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...