bzoj 3667: Rabin-Miller算法 (Miller_rabbin+Pollard rho)
来源:互联网 发布:淘宝怎看同行退款率 编辑:程序博客网 时间:2024/05/16 18:23
3667: Rabin-Miller算法
Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1278 Solved: 398
[Submit][Status][Discuss]
Description
Input
第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime
第二,如果不是质数,输出它最大的质因子是哪个。
Output
第一行CAS(CAS<=350,代表测试数据的组数)
以下CAS行:每行一个数字,保证是在64位长整形范围内的正数。
对于每组测试数据:输出Prime,代表它是质数,或者输出它最大的质因子,代表它是和数
Sample Input
6
2
13
134
8897
1234567654321
1000000000000
2
13
134
8897
1234567654321
1000000000000
Sample Output
Prime
Prime
67
41
4649
5
Prime
67
41
4649
5
HINT
数据范围:
保证cas<=350,保证所有数字均在64位长整形范围内。
Source
题解:Miller_rabbin+Pollard rho
这道题时限卡的丧心病狂,不能用快速乘,否则会TLE
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define LL long long using namespace std;LL n,mx;LL mul(LL a,LL b,LL p){ /*LL ans=0; LL base=a%p; while (b) { if (b&1) ans=(ans+base)%p; b>>=1; base=(base+base)%p; } return ans;*/ LL tmp=(a*b-(LL)((long double)a/p*b+1e-8)*p); return tmp<0?tmp+p:tmp;}LL quickpow(LL num,LL x,LL p){ LL ans=1; LL base=num%p; while (x) { if (x&1) ans=mul(ans,base,p); x>>=1; base=mul(base,base,p); } return ans;}bool miller_rabbin(LL n){ if (n==2) return true; if (n<=1||!(n&1)) return false; LL t=0,a,x,y,u=n-1; while (!(u&1)) t++,u>>=1; for (int i=0;i<=10;i++) { a=rand()*rand()%(n-1)+1; x=quickpow(a,u,n); for (int j=0;j<t;j++) { y=mul(x,x,n); if (y==1&&x!=1&&x!=n-1) return false; x=y; } if (x!=1) return false; } return true;}LL gcd(LL x,LL y){ LL r; while (y) { r=x%y; x=y; y=r; } return x;}LL pollard_rho(LL n,LL c){ LL k=2; LL x=rand()%n,y=x,p=1; for(LL i=1;p==1;i++) { x=(mul(x,x,n)+c)%n; p=y>x?y-x:x-y; p=gcd(n,p); if(i==k)y=x,k+=k; } return p;}void solve(LL n){ if (n==1) return; if (miller_rabbin(n)) { mx=max(mx,n); return; } LL p=n; while (p==n) p=pollard_rho(p,rand()%(n-1)+1); solve(p); solve(n/p);}int main(){ srand(2000001001); int T; scanf("%d",&T); while (T--) { scanf("%lld",&n); //cout<<n<<endl; mx=0; solve(n); if (mx==n) puts("Prime"); else printf("%lld\n",mx); }}
0 0
- bzoj 3667: Rabin-Miller算法 (Miller_rabbin+Pollard rho)
- 【Pollard Rho模板】【bzoj 3667】: Rabin-Miller算法
- BZOJ 3667 Pollard-rho &Miller-Rabin
- POJ1811--miller rabin&pollard rho
- [POJ 1811]Prime Test---Miller-Rabin算法&Pollard-rho算法
- Miller-Rabin及Pollard-Rho算法学习小记
- BZOJ 4802 欧拉函数(素数判定Miller-Rabin+素因子分解Pollard-rho+欧拉函数)
- Pollard的rho启发式因子分解算法 & [CodeVS 4939] 欧拉函数:Miller-Rabin + Pollard-rho 质因数分解
- POJ 1811 Prime Test Miller-Rabin算法和Pollard rho算法
- POJ 2429 GCD & LCM Inverse【miller-rabin算法+pollard rho 算法】
- 【知识点】大数分解与素数判定 --- 【Miller-rabin算法】【pollard-rho算法】
- 素数判定与大数分解【Miller-rabin算法】【pollard-rho算法】
- bzoj 3667: Rabin-Miller算法
- BZOJ 3667 Rabin-Miller算法
- poj1811(Miller-Rabin(素数测试)与Pollard rho(整数的因子分解))
- POJ 1811 Prime Test(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ 2429 GCD & LCM Inverse(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ1811 miller-rabin素数测试pollard-rho质因子分解
- ros gdb
- OpenGL入门学习笔记(一)
- java 蓝桥杯 分解质因子
- 11G RAC OLR维护命令
- 做过程序员的产品经理是一种什么样的存在?
- bzoj 3667: Rabin-Miller算法 (Miller_rabbin+Pollard rho)
- Morphological filtering/形态学滤波
- js参数中不能出现有反斜杠
- 让绝对定位的元素水平居中对齐
- 设计模式学习笔记一(创建型)
- 通过汇编看vs2015下c++各标准库的实现原理
- Java中常用的数据类型转换方法
- 微信小程序 页面的的滚动问题
- 压缩命令(1)