一、题目描述

输入输出样例
输入 #1
6
2
13
134
8897
1234567654321
1000000000000
输出 #1
Prime
Prime
67
41
4649
5
说明/提示
2018.8.14 新加数据两组,时限加大到2s,感谢 @whzzt
by @will7101
二、算法分析说明与代码编写指导



三、AC 代码:
1、这题采用__int128作为中间类型的快速幂取模配合Miller-Rabin算法比采用long double作为中间类型时要快,原因不明。
2、采用long double作为中间变量的快速积取模配合Pollard-Rho算法比采用__int128类型作为中间变量时要快,原因不明。
3、Pollard-Rho算法中当 j % 127 == 0 时提前计算GCD是为什么,我也不知道:
if (j % 127 == 0) {
d = gcd((_Ty)M, n); if (d > 1)return d; }
4、Pollard-Rho算法只能返回一个数的一个非平凡因子。题目要求当数不是质数时,输出这个数的最大质因子。此时要对Pollard-Rho算法的返回值进行素性检验,如果不是素数,就要继续递归分解。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#pragma warning(disable:4996)
using namespace std;
long long x, MaxPrimeDivisor, prime[] = {
2,3,5,7,11,13,17,19,23,29,31,37 }, * prime_end = prime + sizeof
洛谷P4718:Pollard - Rho算法模板详解

这篇博客详细介绍了洛谷P4718题目的解题思路,重点讲解了Pollard-Rho算法的实现,同时结合了快速幂取模、快速积取模以及Miller-Rabin素性检验。文中提到在特定情况下,使用__int128作为中间类型的快速幂比long double更快,而快速积取模时则反之。此外,文章还讨论了Pollard-Rho算法中关于j % 127 == 0时提前计算GCD的策略,并指出该算法只能找到非质数的一个非平凡因子,需要进一步检验和分解以满足题目要求。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



