一、题目描述
输入输出样例
输入 #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 +