【刷题】BZOJ 3667 Rabin-Miller算法
Input
第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime
第二,如果不是质数,输出它最大的质因子是哪个。
Output
第一行CAS(CAS<=350,代表测试数据的组数)
以下CAS行:每行一个数字,保证是在64位长整形范围内的正数。
对于每组测试数据:输出Prime,代表它是质数,或者输出它最大的质因子,代表它是和数
Sample Input
2
13
134
8897
1234567654321
1000000000000
Sample Output
Prime
67
41
4649
5
HINT
数据范围:
保证cas<=350,保证所有数字均在64位长整形范围内。
Solution
裸Pollard Rho题
但它不简单,反而很恶心
不知道为什么数据那么强
几个注意的:
1)乘法要写快速乘,原理是a%b=a-a/b*b
2)Miller Rabin最好优化
3)有些版本的Pollard Rho是错的。。。被坑了好久(数学一本通)
这东西本身有概率错误,导致调都不知道调哪里,最后是照着zhou888的代码一点一点边改边交边调的
#include<bits/stdc++.h>
#define ll unsigned long long
const int Count=;
int base[]={,,,,,};
ll ans;
template<typename T> inline void read(T &x)
{
T data=,w=;
char ch=;
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')w=-,ch=getchar();
while(ch>=''&&ch<='')data=((T)data<<)+((T)data<<)+(ch^''),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char c='\0')
{
if(x<)putchar('-'),x=-x;
if(x>)write(x/);
putchar(x%+'');
if(c!='\0')putchar(c);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
inline ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
inline ll qmul(ll a,ll b,ll n)
{
return (a*b-(ll)(((long double)a*b+0.5)/n)*n+n)%n;
}
inline ll qexp(ll a,ll b,ll n)
{
ll res=;
while(b)
{
if(b&)res=qmul(res,a,n);
a=qmul(a,a,n);
b>>=;
}
return res;
}
inline bool Miller_Rabin(ll N)
{
if(N==||(N>&&N%!=&&N%!=))return false;
for(register int i=;i<=;++i)
if(N==base[i])return true;
else if(N%base[i]==)return false;
ll p=N-,A,pre,k=;
while(!(p&))p>>=,++k;
for(register int i=;i<=Count;++i)
{
A=rand()%(N-)+;
A=qexp(A,p,N);
pre=A;
for(register int j=;j<=k;++j)
{
A=qmul(A,A,N);
if(A==&&pre!=&&pre!=N-)return false;
pre=A;
}
if(A!=)return false;
}
return true;
}
inline ll abs(ll x,ll y)
{
return y>x?y-x:x-y;
}
inline int Pollard_Rho(ll N,ll C)
{
ll k=,x=rand()%N,y=x,d=;
for(register ll i=;d==;++i)
{
x=(qmul(x,x,N)+C)%N;
d=gcd(abs(x,y),N);
if(i==k)k<<=1ll,y=x;
}
return d;
}
inline void solve(ll N)
{
if(N==)return ;
if(Miller_Rabin(N))
{
chkmax(ans,N);
return ;
}
ll p,c=;
while((p=Pollard_Rho(N,c))==N&&c<=N)c++;
solve(p);solve(N/p);
}
int main()
{
srand();
int T;
read(T);
while(T--)
{
ll N;
read(N);
ans=;
solve(N);
if(ans==N)puts("Prime");
else write(ans,'\n');
}
return ;
}
3667 Rabin-Miller算法
【刷题】BZOJ 3667 Rabin-Miller算法的更多相关文章
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- LeetCode刷题--基础知识篇--KMP算法
KMP算法 关于字符串匹配的算法,最知名的莫过于KMP算法了,尽管我们日常搬砖几乎不可能去亲手实现一个KMP算法,但作为一种算法学习的锻炼也是很好的,所以记录一下. KMP算法是根据三位作者(D.E. ...
- 面试刷题25:jvm的垃圾收集算法?
垃圾收集是java语言的亮点,大大提高了开发人员的效率. 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别. 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪 ...
- PAT-甲级刷题笔记和总结
本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...
- leetcode top-100-liked-questions刷题总结
一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
随机推荐
- jenkins使用时出现的问题!
从安装到日常使用中遇到过的问题和解决方法: 背景/问题:安装时是跳过安装插件过程的,安装好后,我发现里面啥也做不了,连个git的插件都无法下载. 方法:在jenkins的主界面,打开系统管理= ...
- VS Code配置初探
之前一直在用 Webstorm,看现在 VS Code 热度那么高,想着尝试一下. 熟悉编辑器的快捷键 VS Code 快捷键一览 安装使用到的插件 Chinese(修改你的编辑器语言,默认英文) E ...
- 学习python,第二篇
注释 # 单行注释 ''' 多行注释 ''' 或者 """ 多行注释 """ # Author: Itxpl mag ...
- php从入门到放弃系列-03.php函数和面向对象
php从入门到放弃系列-03.php函数和面向对象 一.函数 php真正的威力源自它的函数,内置了1000个函数,可以参考PHP 参考手册. 自定义函数: function functionName( ...
- 炸!分享美团面试关于selenium的面试题
个人分类: 软件测试 编辑 在这个互联网技术快速迭代的时代,每个测试员都知道技术对于职业发展的重要性,那些技术好的测试员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去 ...
- Workbook对象的方法总结(二)
(1).Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽. 例如: >>> sheet.row_dimensio ...
- 基础业务:滚动到指定位置导航固定(CSS实现)
最近公司做的业务都是使用Vue.Element写的,涉及到的相应的基础业务像轮播.预加载.懒加载,都是使用 NPM上的工具来实现,原理和基础还是要有的,就来实现几个项目中常用到的业务. 经常见到这样的 ...
- Beta版发布 - 感谢有你们
在本次Beta版开发的过程中,很感谢组长王航对我的信任,让我统筹大家的工作任务和进度,使我对项目管理有了深刻的理解. 我也要感谢邹双黛,在beta版开发中因为邹双黛的帮助,我对于文字类工作已经越来越得 ...
- json转对象
1,引入依赖 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib& ...
- 作业1.3——Android平台的开发环境的发展演变
一开始的打算是在eclipse的基础上搭建Android平台,在ADT.SDK上兜兜转转,听过一些前车之鉴后,还是选择了Android studio.因为之前安装过eclipse,就省去了JDK下载和 ...