poj1811(pollard_rho模板)
题目链接: 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模板)的更多相关文章
- POJ-1811-Prime Test(pollard_rho模板,快速找最小素因子)
题目传送门 sol:Pollard_Rho的模板题,刚看了Pollard_Rho和Miller_Rabin很多原理性的东西看不懂,只是记住了结论勉强能敲代码. Pollard_Rho #include ...
- HDU-3864 D_num Miller_Rabin和Pollard_rho
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给定一个数n,求n的因子只有四个的情况. Miller_Rabin和Pollard_rho ...
- POJ 2429
思路:a/n*b/n=lcm/gcd 所以这道题就是分解ans.dfs枚举每种素数情况.套Miller_Rabin和pollard_rho模板 //#pragma comment(linker, &q ...
- 模板题Pollard_Rho大数分解 A - Prime Test POJ - 1811
题意:是素数就输出Prime,不是就输出最小因子. #include <cstdio> #include<time.h> #include <algorithm> ...
- Pollard_Rho大数分解模板题 pku-2191
题意:给你一个数n, 定义m=2k-1, {k|1<=k<=n},并且 k为素数; 当m为合数时,求分解为质因数,输出格式如下:47 * 178481 = 8388607 = ( ...
- POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)
http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...
- 【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 ...
- 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】
集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
随机推荐
- 关于C#客户端引用C++ dll的问题
近期在做项目的过程中需要在Winform客户端项目引用由C++编译的DLL,于是对相关的内容进行了一些研究,有几点心得总结如下. 第一步是制作要引用的类库: (1)首先拿到C++的dll,需要注意的是 ...
- python第三十二天-----算法
算法(Algorithm):一个计算过程,解决问题的方法时间复杂度:用来评估算法运行效率的一个东西ps:在日常使用中,请使用sort(),because no zuo no die! 1.冒泡排序:指 ...
- 将Windows下磁盘出现黑色为分配区域变成绿色区域
在windows下不知什么原因, 有一块磁盘空间F盘就变成了黑色为分配区域. 黑色区域无法用来安装双系统, 网上查阅资料后, 找到了如何将他重新变回绿色区域的2个方法(方法二是自己无意操作成功的). ...
- [Python]python CGI脚本在apache服务器上运行时出现“Premature end of script headers”错误
在测试自己的python CGI脚本时, 当html网页中的表单form内容传送到服务器python脚本时, 总是出现Premature end of script headers错误, 网页显示是服 ...
- 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- leetcode377
public class Solution { private int[] dp; public int CombinationSum4(int[] nums, int target) { dp = ...
- LNMP 1.3 测试php解析
测试解析LNMP的php解析 先打开nginx的配置文件 vim /usr/local/nginx/conf/nginx.conf location ~ \.php$ { root html; fas ...
- LookupError: unknown encoding: cp65001解决办法
一.之前手上做的一个web项目,漏洞频发,服务器用的是菜鸟云服务器,那个应急响应中心不错,想不到乌云倒了,白帽子竟然被阿里系养了,题外话了,首先感谢白帽子提的漏洞,同时也感慨自己安全知识,以及意识的薄 ...
- [hdu3949]XOR(线性基求xor第k小)
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- [poj3686]The Windy's(费用流)
题目大意: 解题关键:指派问题,待更. #include<cstdio> #include<cstring> #include<algorithm> #includ ...