题目链接: http://poj.org/problem?id=1811

题意: 判断一个数 n (2 <= n < 2^54)是否为质数, 是的话输出 "Prime", 否则输出其第一个质因子.

思路: 大数质因子分解, 直接用 pollard_rho (详情参见: http://blog.csdn.net/maxichu/article/details/45459533) 模板即可.

代码:

 #include <iostream>
#include <algorithm>
#define ll long long
using namespace std; const int MAXN = 1e2;
const int repeat = ;//repeat为检测次数,判断错误率为4^-repeat,一般8~10就够了 ll get_mult(ll a, ll b, ll c){//返回a*b%c
a %= c;
b %= c;
ll ret = ;
while(b){
if(b & ){
ret += a;
if(ret >= c) ret -= c;
}
b >>= ;
a <<= ;
if(a >= c) a -= c;
}
return ret;
} ll get_pow(ll x, ll n, ll mod){//返回x^n%mod
ll ret = ;
x %= mod;
while(n){
if(n & ) ret = get_mult(ret, x, mod);
x = get_mult(x, x, mod);
n >>= ;
}
return ret;
} //通过 a^(n-1) = 1(mod n) 来判断n是否为素数
//n-1 = x*2^t 中间使用二次探测定理
//是合数返回true,不一定是合数返回false
bool cherk(ll a, ll n, ll x, ll t){
ll ret = get_pow(a, x, n);
ll last = ret;
for(int i = ; i <= t; i++){
ret = get_mult(ret, ret, n);
if(ret == && last != && last != n - ) return true;
last = ret;
}
if(ret != ) return true;
return false;
} bool Miller_Rabin(ll n){
if(n < ) return false;
if(n == ) return true;
if(!(n & )) return false;//偶数
ll x = n - , t = ;
while(!(x & )){
x >>= ;
t++;
}
// srand(time(NULL));
for(int i = ; i < repeat; i++){
ll a = rand() % (n - ) + ;
if(cherk(a, n, x, t)) return false;
}
return true;
} ll factor[MAXN];
int tot;//n的质因子个数 ll get_gcd(ll a, ll b){
ll tmp;
while(b){
tmp = a;
a = b;
b = tmp % b;
}
return a >= ? a : -a;
} ll pollard_rho(ll x, ll c){//返回x的一个因子
ll i = , k = ;
// srand(time(NULL));
ll x0 = rand() % (x - ) + ;
ll y = x0;
while(){
i++;
x0 = (get_mult(x0, x0, x) + c) % x;
ll d = get_gcd(y - x0, x);
if(d != && d != x) return d;
if(y == x0) return x;
if(i == k){
y = x0;
k += k;
}
}
} void findfac(ll n, int k){//对n质因分解并将结果保存到factor中
if(n == ) return;
if(Miller_Rabin(n)){
factor[tot++] = n;
return;
}
ll p = n;
int c = k;//c防止死循环
while(p >= n){
p = pollard_rho(p, c--);
}
findfac(p, k);
findfac(n / p, k);
} int main(void){
ll n;
int t;
cin >> t;
while(t--){
cin >> n;
if(Miller_Rabin(n)) cout << "Prime" << endl;
else{
tot = ;
findfac(n, );
ll sol = factor[];
for(int i = ; i < tot; i++){
sol = min(sol, factor[i]);
}
cout << sol << endl;
}
}
return ;
}

poj1811(pollard_rho模板)的更多相关文章

  1. POJ-1811-Prime Test(pollard_rho模板,快速找最小素因子)

    题目传送门 sol:Pollard_Rho的模板题,刚看了Pollard_Rho和Miller_Rabin很多原理性的东西看不懂,只是记住了结论勉强能敲代码. Pollard_Rho #include ...

  2. HDU-3864 D_num Miller_Rabin和Pollard_rho

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给定一个数n,求n的因子只有四个的情况. Miller_Rabin和Pollard_rho ...

  3. POJ 2429

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

  4. 模板题Pollard_Rho大数分解 A - Prime Test POJ - 1811

    题意:是素数就输出Prime,不是就输出最小因子. #include <cstdio> #include<time.h> #include <algorithm> ...

  5. Pollard_Rho大数分解模板题 pku-2191

    题意:给你一个数n,  定义m=2k-1,   {k|1<=k<=n},并且 k为素数;  当m为合数时,求分解为质因数,输出格式如下:47 * 178481 = 8388607 = ( ...

  6. POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

    http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...

  7. 【POJ1811】【miller_rabin + pollard rho + 快速乘】Prime Test

    Description Given a big integer number, you are required to find out whether it's a prime number. In ...

  8. 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

    集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...

  9. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

随机推荐

  1. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  2. SQL 由人员汇总到部门树递归合计总数函数

    1.由人员计算出总数,在部门树(tree)按结构汇总(主父绑定) CREATE function [dbo].[GetEmpDepNum] ( @ID int ) RETURNS @Tree Tabl ...

  3. Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)

    以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...

  4. 2016.1.19 DEV Express控件GirdControl使用

    103.GridControl中添加Button RunDesigner,添加一列,设置对应字段FiledName,ColumnEdit选择ButtonEdit,此时默认风格像下拉框,需调整属性: 在 ...

  5. SqlServer——事务一编程进阶(SqlServer技术内幕 T-SQL程序设计 第九章

    事务格式如下: 1.开启事务: begin tran 2.提交事务:commit tran 3.回滚事务:rollback tran 判断事务是提交还是应该回滚有两种方式,一是全局变量 @@error ...

  6. 解决实现OnPageChangeListener()接口的方法参数出现arg0,arg1的现象

    在安卓开发中,我们经常用到ViewPager,那么既然用到ViewPager,一般都需要去实现OnPageChangeListener()接口的三个方法. 但是有时候实现的三个方法的参数都变成agr0 ...

  7. Springboot中AOP统一处理请求日志

    完善上面的代码: 现在把输出信息由先前的system.out.println()方式改为由日志输出(日志输出的信息更全面) 现在在日志中输出http请求的内容 在日志中获取方法返回的内容

  8. viewpagerindicator+UnderlinePageIndicator+ viewpage切换

    布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  9. day35 02-Hibernate持久化对象状态及状态转换

    hibernate内置有一个c3p0,不用引入c3p0的jar包也行. 现在其实可以不用去创建表和实体类.因为hibernate可以自动帮我们生成.只要把映射建好了它就可以自动帮我们生成. 创建实体类 ...

  10. [poj3041]Asteroids(二分图的最小顶点覆盖)

    题目大意:$N*N$的网格中有$n$颗行星,若每次可以消去一整行或一整列,求最小的攻击次数使得消去所有行星. 解题关键:将光束当做顶点,行星当做连接光束的边建图,题目转化为求该图的最小顶点覆盖,图的最 ...