BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)

题目链接
Pollard_Rho:http://blog.csdn.net/thy_asdf/article/details/51347390

#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
const int p[]={2,3,5,7,11,13,17,19};
typedef long long LL;
LL Ans;

inline LL read()
{
    LL now=0,f=1;register char c=gc();
    for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now*f;
}
inline LL Mult(LL a,LL b,LL p)//O(1)快速乘
{
    LL tmp=a*b-(LL)((long double)a/p*b+1e-8)*p;
    return tmp<0?tmp+p:tmp;
}
LL Fast_Pow(LL n,LL k,LL p)
{
    LL t=1;
    for(;k;k>>=1,n=n*n%p)
        if(k&1) t=t*n%p;
    return t;
}
bool Miller_Rabin(LL n)
{
    if(n==2) return 1;
    if(!(n&1)||n==1) return 0;
    for(int i=0;i<8;++i)
        if(n==p[i]) return 1;
        else if(!(n%p[i])) return 0;
    LL u=n-1,now,las; int t=0;
    while(!(u&1)) u>>=1,++t;
    for(int i=0;i<8;++i)
    {
        now=Fast_Pow(p[i],u,n);
        for(int j=1;j<=t;++j)
        {
            las=now, now=Mult(now,now,n);
            if(now==1&&las!=1&&las!=n-1) return 0;
        }
        if(now!=1) return 0;
    }
    return 1;
}
LL gcd(LL x,LL y)
{
    return y?gcd(y,x%y):x;
}
LL Rho(LL n,LL delta)
{//现要分解n,有两个随机数x,y,若p=gcd(x-y,n)!=1&&p!=n,那么p为n的一个约数...省略
    LL x=rand()%n,y=x,p=1; int k=2;//设定k为此次路径长
    for(int i=1;p==1;++i)
    {
        x=(Mult(x,x,n)+delta)%n;//随机函数f(x)=x*x+d
        p=gcd(std::abs(x-y),n);//多次生成随机数,直至找到p是n的一个因子
        if(i==k) y=x,k<<=1;//达到k次后把y赋值为x。路径每次倍长
    }
    return p;
}
void Find(LL n)
{
    if(n==1) return;
    if(Miller_Rabin(n)) {Ans=std::max(Ans,n);/*fac[++cnt]=n;*/ return;}
    LL t=n;
    while(t==n) t=Rho(n,rand()%(n-1)+1);
    //t=n说明这个随机函数会导致走到n的环上,再换一个重试即可
    Find(t), Find(n/t);
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("3667.in","r",stdin);
#endif

    int t=read();LL n;
    while(t--)
        n=read(),Ans=0,Find(n),Ans==n?puts("Prime"):printf("%lld\n",Ans);
    return 0;
}

原文地址:https://www.cnblogs.com/SovietPower/p/8448321.html

时间: 2024-10-15 09:05:23

BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)的相关文章

数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p2^{a2}p3^{a3}...pn^{an},b=p1^{b1}p2^{b2}p3^{b3}...pn^{bn}\),那么\(gcd(a,b)=\prod_{i=1}^{n}pi^{min(ai,bi)},lcm(a,b)=\prod_{i=1}^{n}pi^{max(ai,bi)}\)(0和任何

Rabin Karp 算法实战

关键字 Rabin karp 算法, C++, ubuntu 14.04, linux, big integer, gmp 为了计算冗余度, 我写出了如下算法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

bzoj 3667

3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1214  Solved: 368[Submit][Status][Discuss] Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个. Output

BZOJ 3160 万径人踪灭 Manacher算法+快速傅里叶变换

题目大意:给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数 首先回文一定是将字符串倍增 由于求的是不连续回文子序列的个数 因此我们可以求出总回文子序列的个数,然后减掉连续的 连续的就是回文子串 用Manacher算法可以O(n)求解 不连续的就有些难搞了 首先我们令f[i]表示以i为中心的对称字符对个数 比如s[]=$#a#b#a 那么s[4]='b' f[4]=2 那么对于每个中心i我们有(2^f[i])-1种方案 答案即Σ[1<=i<=n*2+1]((2^f[i])-1) 问

Miller-Rabin,Pollard-Rho(BZOJ3667)

裸题直接做就好了. #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; typedef long long ll; const int p[]={2,3,5,7,11,13,17,19,23}; int T; ll n,mx; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll mul(ll a,ll b,ll p) { ll

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

BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][Status][Discuss] Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个. O

Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要把询问范围加到 \(10^{18}\) ,再多组询问呢? Miller 和 Rabin 建立了Miller-Rabin 质数测试算法. \(\\\) Fermat 测试 首先我们知道费马小定理: \[ a^{p-1}\equiv 1\pmod p \] 当且仅当 \(p\) 为素数时成立. 逆命题是

模式字符串匹配问题(KMP算法)

这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这就不重复了. 需要说明的是: stra:主串,及需要从中寻找模式串的字符串 strb:模式串 <算法导论>上面包括严蔚敏老师<数据结构>,字符串下表是按从1开始,并且<数据结构>一书中貌似吧字符串的第一个字符用来储存字符串长度.这里我改成了0. maxlen :字符串的最长

算法导论.pdf

下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受.全书各章自成体系,可以作为独立的学习单元:算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂:说明和解释力求浅显易懂,不失深度和数学严谨性. 全书选材经典.内容丰富.结构合理.逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教