/*
题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子
Miller Rabin +Poller Rho 大素数判定+大数找质因子
后面这个算法嘛 基于Birthday Paradox
简单点说就是 在 1到100 内去一个数 ai ai==42的概率很小
但是如果取两个数 ai bi ai-bi==42 的概率就会变大
应用到找素因子上 就不用像试除法那样一个一个的试
但是如果枚举ai bi 显然也很slow 那么有一个非常好使(奇怪)的函数
f(x)=x*x+c 这样将x和f(x)%p作为两个数 看看x-f(x) 与p的关系
这里我们不是试试 p%(x-f(x))==0来找 而是 gcd一下 d=(p,(x-f(x)))
d显然是p的因子 然后分解d 这样就ok了 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#define ll long long
using namespace std;
ll T,ans[],tot;
ll init()
{
ll x=;char s;s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a%b);
}
ll slow_mul(ll a,ll b,ll c)//防止爆掉
{
a=a%c;b=b%c;
ll an=;
while(b)
{
if(b&)
{
b--;
an=an+a;
an=an%c;
}
a<<=;a=a%c;b>>=;
}
return an;
}
ll Mi(ll a,ll m,ll p)
{
if(m==)return ;
ll x=Mi(a,m/,p)%p;
x=slow_mul(x,x,p);
if(m&)x=slow_mul(x,a,p);
return x;
}
ll Pollard_rho(ll p,ll c)
{
ll i=,k=;
ll x=rand()%(p-)+;
ll fx=x;
while()
{
i++;
x=(slow_mul(x,x,p)+c)%p;
ll g=gcd(fx-x+p,p);//防止fx-x<0
if(g!=&&g!=p)return g;//找到一个因子
if(x==fx)return p;//进入环 换一个随机数
if(i==k)
{
k=k+k;
fx=x;
}
}
}
bool Miller_Rabin(ll n)
{
if(n==)return ;
if(n==||!(n&))return ;
ll m=n-,j=;
while(!(m&))
{
j++;
m=m>>;
}
//srand(unsigned(time(0)));丫丫的poj用srand会RE 我看了好久0.0
for(int i=;i<=;i++)
{
ll a=rand()%(n-)+;
ll x=Mi(a,m,n);
for(int k=;k<=j;k++)
{
ll y=slow_mul(x,x,n);
if(y==&&x!=&&x!=n-)return ;
x=y;
}
if(x!=)return ;
}
return ;
}
void findpri(ll n)//质因数分解n
{
if(n<=)return;
if(Miller_Rabin(n))
{
ans[++tot]=n;
return ;
}
ll p=n;
while(p==n)//可能生成的随机数不合适
p=Pollard_rho(p,rand()%(n-)+);//返回n的一个因子
findpri(p);
findpri(n/p);
}
int main()
{
T=init();
while(T--)
{
ll n=init();
if(Miller_Rabin(n))//素数先来个判断
{
printf("Prime\n");
continue;
}
memset(ans,,sizeof(ans));//所有质因子
tot=;
findpri(n);//找质因子
ll an=ans[];
for(int i=;i<=tot;i++)
an=min(an,ans[i]);
printf("%lld\n",an);
}
return ;
}

poj 1811 Pallor Rho +Miller Rabin的更多相关文章

  1. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  2. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  3. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  4. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  5. 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 这 ...

  6. POJ1811- Prime Test(Miller–Rabin+Pollard's rho)

    题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...

  7. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  8. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  9. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

随机推荐

  1. uboot总结:uboot配置和启动过程2(mkconfig分析)

    说明:文件位置:在uboot的目录下,文件名为:mkconfig.本身是一个脚本文件. 它的主要作用的是: (1)创建一个重要的符号链接 (2)创建一个config.mk文件(在include目录下) ...

  2. Ruby自学笔记(六)— 循环

    循环结构在编程语言中是不可或缺的,所以Ruby中的循环也有其自定义的规则. 而我们关注循环结构,要知道两个因素:1) 循环的条件:2) 循环执行的内容 Ruby有一些方式来实现循环结构体: 1. ti ...

  3. BZOJ 1563 诗人小G

    Description Input Output 对于每组数据,若最小的不协调度不超过\(10^{18}\),则第一行一个数表示不协调度若最小的不协调度超过\(10^{18}\),则输出"\ ...

  4. SSH2中实例化不了Action的一个原因

    <!-- 流程管理 --> <action name="flow_*" class="workFlowAction" method=" ...

  5. java学习之变量

    看完了常量,那我们来看下变量. 变量顾名思义,也就是能变化的量,也就是说已经定义之后它的值仍然是可以变的,不像常量一经定义便不能够改变了.比如说现在我们需要一个数,需要用户输入之后才能,确定这个数是几 ...

  6. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  7. BZOJ1631: [Usaco2007 Feb]Cow Party

    1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 459  Solved: 338[Submit ...

  8. PHP删除数组中特定元素

    方法一: <?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false) array_sp ...

  9. N-Queens II——Leetcode

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  10. Swap Nodes in Pairs——LeetCode

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...