POJ2429 GCD & LCM Inverse pollard_rho大整数分解
Input
Output
Sample Input
3 60
Sample Output
12 15
题意:给出两个数的最大公约数和最小公倍数,让你找出满足条件的两个数,使他们的和最小。
题解:
对于两个数a,b和他们的最大公约数gcd以及最小公倍数lcm,有lcm=a*b/gcd,进一步变形可以得到:(a/gcd * b/gcd)*gcd=lcm,即(a/gcd * b/gcd)=lcm/gcd,我们令m=a/gcd,n=b/gcd,那么问题就变为了:找出两个互素的整数,使他们的乘积为key=lcm/gcd。我们可以用Pollard_rho算法进行质因素分解的方法找出lcm/gcd的所有素因子,然后dfs找出任意几个素数因子之积(设为x),设y=key/x,找出最小的x+y就行了
代码:
1 #include <cstdio>
2
3 #include <iostream>
4
5 #include <cstdlib>
6
7 #include <cmath>
8
9 #include <algorithm>
10
11
12
13 #define times 10
14
15 #define N 501
16
17 using namespace std;
18
19 typedef unsigned long long LL;
20
21 const LL INF=(LL)1<<61;
22
23 LL key,ct,cnt,gd,lm,resa,resb,mini;
24
25 LL fac[N],num[N];
26
27
28
29 LL gcd(LL a,LL b)
30
31 {
32
33 return b?gcd(b,a%b):a;
34
35 }
36
37
38
39 LL multi(LL a,LL b,LL m)
40
41 {
42
43 LL ans=0;
44
45 a%=m;
46
47 while(b)
48
49 {
50
51 if(b&1)
52
53 {
54
55 ans=(ans+a)%m;
56
57 b--;
58
59 }
60
61 b>>=1;
62
63 a=(a+a)%m;
64
65 }
66
67 return ans;
68
69 }
70
71
72
73 LL quick_mod(LL a,LL b,LL m)
74
75 {
76
77 LL ans=1;
78
79 a%=m;
80
81 while(b)
82
83 {
84
85 if(b&1)
86
87 {
88
89 ans=multi(ans,a,m);
90
91 b--;
92
93 }
94
95 b>>=1;
96
97 a=multi(a,a,m);
98
99 }
100
101 return ans;
102
103 }
104
105
106
107 bool Miller_Rabin(LL n)
108
109 {
110
111 if(n==2) return true;
112
113 if(n<2||!(n&1)) return false;
114
115 LL m=n-1;
116
117 int k=0;
118
119 while(!(m&1))
120
121 {
122
123 k++;
124
125 m>>=1;
126
127 }
128
129 for(int i=0;i<times;i++)
130
131 {
132
133 LL a=rand()%(n-1)+1;
134
135 LL x=quick_mod(a,m,n);
136
137 LL y=0;
138
139 for(int j=0;j<k;j++)
140
141 {
142
143 y=multi(x,x,n);
144
145 if(y==1&&x!=1&&x!=n-1) return false;
146
147 x=y;
148
149 }
150
151 if(y!=1) return false;
152
153 }
154
155 return true;
156
157 }
158
159
160
161 LL Pollard_rho(LL n,LL c)
162
163 {
164
165 LL i=1,k=2;
166
167 LL x=rand()%(n-1)+1;
168
169 LL y=x;
170
171 while(true)
172
173 {
174
175 i++;
176
177 x=(multi(x,x,n)+c)%n;
178
179 LL d=gcd((y-x+n)%n,n);
180
181 if(1<d&&d<n) return d;
182
183 if(y==x) return n;
184
185 if(i==k)
186
187 {
188
189 y=x;
190
191 k<<=1;
192
193 }
194
195 }
196
197 }
198
199
200
201 void Find(LL n,LL c)
202
203 {
204
205 if(n==1) return ;
206
207 if(Miller_Rabin(n))
208
209 {
210
211 fac[ct++]=n;
212
213 return ;
214
215 }
216
217 LL p=n;
218
219 LL k=c;
220
221 while(p>=n) p=Pollard_rho(p,c--);
222
223 Find(p,k);
224
225 Find(n/p,k);
226
227 }
228
229
230
231 void dfs(LL dept,LL product)
232
233 {//dept为递归深度,product为其中一个因子
234
235 if(dept==cnt)
236
237 {
238
239 LL a=product;
240
241 LL b=key/a;
242
243 if(gcd(a,b)==1)
244
245 {
246
247 a*=gd;
248
249 b*=gd;
250
251 if(a+b<mini)
252
253 {
254
255 mini=a+b;
256
257 resa=a;
258
259 resb=b;
260
261 }
262
263 }
264
265 return ;
266
267 }
268
269 for(int i=0;i<=num[dept];i++)
270
271 {
272
273 if(product>mini) return ;
274
275 dfs(dept+1,product);
276
277 product*=fac[dept];
278
279 }
280
281 }
282
283
284
285
286
287 void Solve(LL n)
288
289 {
290
291 ct=0;
292
293 Find(n,120);
294
295 sort(fac,fac+ct);
296
297 num[0]=1;
298
299 int k=1;
300
301 for(int i=1;i<ct;i++)
302
303 {
304
305 if(fac[i]==fac[i-1])
306
307 num[k-1]++;
308
309 else
310
311 {
312
313 num[k]=1;
314
315 fac[k++]=fac[i];
316
317 }
318
319 }
320
321 cnt=k;
322
323 dfs(0,1);
324
325 if(resa>resb) swap(resa,resb);
326
327 }
328
329
330
331 int main()
332
333 {
334
335 while(cin>>gd>>lm)
336
337 {
338
339 if(gd==lm)
340
341 {
342
343 printf("%llu %llu\n",gd,lm);
344
345 continue;
346
347 }
348
349 mini=INF;
350
351 key=lm/gd;
352
353 Solve(key);
354
355 printf("%llu %llu\n",resa,resb);
356
357 }
358
359 return 0;
360
361 }
POJ2429 GCD & LCM Inverse pollard_rho大整数分解的更多相关文章
- POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)
题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...
- 【Pollard-rho算法】【DFS】poj2429 GCD & LCM Inverse
题意:给你一两个数m和n,它们分别是某对数A,B的gcd和lcm,让你求出一对使得A+B最小的A,B. n/m的所有质因子中,一定有一部分是只在A中的,另一部分是只在B中的. 于是对n/m质因子分解后 ...
- poj2429 GCD & LCM Inverse
用miller_rabin 和 pollard_rho对大数因式分解,再用dfs寻找答案即可. http://poj.org/problem?id=2429 #include <cstdio&g ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- [POJ 2429] GCD & LCM Inverse
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10621 Accepted: ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- 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 ...
- POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)
[题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
随机推荐
- MySQL多版本并发控制——MVCC机制分析
MVCC,即多版本并发控制(Multi-Version Concurrency Control)指的是,通过版本链维护一个数据的多个版本,使得读写操作没有冲突,可保证不同事务读写.写读操作并发执行,提 ...
- Openstack OCATA 安装环境说明(一) 未完成版本
1 Openstack简介: 2 实验说明: 3 图例: 4 实验环境说明: 4.1 ) 网卡说明: 网卡名 网 段 连接方式 说明 eth0 10.10.5.0/24 仅主机网络 内部网络自动以IP ...
- 分别使用 Python 和 Math.Net 调用优化算法
1. Rosenbrock 函数 在数学最优化中,Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock 在 1960 年提出 .也称为 R ...
- 使用sqluldr2进行oracle数据库抽取时执行后无反应,也无日志
使用sqluldr2进行oracle数据库表数据抽取时遇到执行后无反应,也不报错,也无日志输出的情况. 经过排查之后发现时由于oracle账户密码快要过期导致的(这也能出问题,我服,类似的plsql连 ...
- 如何用Python中自带的Pandas和NumPy库进行数据清洗
一.概况 1.数据清洗到底是在清洗些什么? 通常来说,你所获取到的原始数据不能直接用来分析,因为它们会有各种各样的问题,如包含无效信息,列名不规范.格式不一致,存在重复值,缺失值,异常值等..... ...
- pytorch——合并分割
分割与合并 import torch import numpy as np #假设a是班级1-4的数据,每个班级里有32个学生,每个学生有8门分数 #假设b是班级5-9的数据,每个班级里有32个学生, ...
- 每天响应数亿次请求,腾讯云如何提供高可用API服务?
每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...
- 一致性哈希算法C#实现
一致性hash实现,以下实现没有考虑多线程情况,也就是没有加锁,需要的可以自行加上.因为换行的问题,阅读不太方便,可以拷贝到本地再读. 1 /// <summary> 2 /// 一致性哈 ...
- 理解和运用 ClassLoader 该篇文章就够了
定义 根据<深入理解Java虚拟机>提到"通过一个类的全限定名(packageName.ClassName)来获取描述此类的二进制字节(class文件字节)这个动作的代码模块就叫 ...
- WeCenter (最新版) 前台RCE漏洞 (2020-02-22)
漏洞通过phar触发反序列化漏洞. 触发点:./models/account.php 中的 associate_remote_avatar 方法: 搜索全局调用了该方法的地方: ./app/accou ...