bzoj3667: Rabin-Miller算法
Description
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位长整形范围内。
Source
题解:
这是miller rabin和pollard rho的裸题,具体见:http://blog.csdn.net/thy_asdf/article/details/51347390
code:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
typedef long long int64;
char ch;
bool ok;
void read(int &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
void read(int64 &x){
ok=;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
int cases;
int64 n;
const int prime[]={,,,,,,,,,};
int64 mul(int64 a,int64 b,int64 mod){
int64 d=((long double)a/mod*b+1E-);
int64 res=a*b-d*mod;
if (res<) res+=mod;
return res;
/*int64 t;
for (t=0;b;b>>=1,a<<=1,a%=mod) if (b&1) t=(t+a)%mod;
return t;*/
}
int64 ksm(int64 a,int64 b,int64 mod){
int64 t;
for (t=;b;b>>=,a=mul(a,a,mod)) if (b&) t=mul(t,a,mod);
return t;
}
bool miller_rabin(int64 n){
for (int i=;i<;i++) if (n==prime[i]) return true;
if (!(n&)) return false;
int64 bit=lowbit(n-),s=,d;
while (bit!=) s++,bit>>=;
d=(n-)>>s;
for (int i=;i<;i++){
int64 x=ksm(prime[i],d,n);
for (int j=;j<=s;j++){
int64 xx=mul(x,x,n);
if (xx==&&x!=n-&&x!=) return false;
x=xx;
}
if (x!=) return false;
}
return true;
}
int cnt;
int64 list[];
int64 random(int64 lim){return ((1LL*rand()<<)+rand())%lim;}
int64 f(int64 x,int64 mod,int64 c){return (mul(x,x,mod)+c+mod)%mod;}
int64 pollard_rho(int64 n,int64 c){
int64 x,y,d=; x=random(n),y=f(x,n,c);
while (d==){
d=__gcd(abs(x-y),n);
x=f(x,n,c),y=f(f(y,n,c),n,c);
}
return d;
}
void work(int64 n){
if (miller_rabin(n)){list[++cnt]=n;return;}
int64 d=pollard_rho(n,random(n-));
while (d==n||d==) d=pollard_rho(n,random(n));
work(d),work(n/d);
}
void decompose(int64 n){
cnt=,work(n),sort(list+,list+cnt+);
printf("%lld\n",list[cnt]);
}
int main(){
srand();
for (read(cases);cases;cases--){
read(n);
if (miller_rabin(n)) puts("Prime");
else decompose(n);
}
return ;
}
bzoj3667: Rabin-Miller算法的更多相关文章
- 【BZOJ3667】Rabin-Miller算法(Pollard_rho)
[BZOJ3667]Rabin-Miller算法(Pollard_rho) 题面 呜,权限题,别问我是怎么做的(我肯定没有权限号啊) 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...
- 【BZOJ-3667】Rabin_Miller算法 随机化判素数
3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 983 Solved: 302[Submit][Status ...
- 【bzoj3667】Rabin-Miller算法
3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1200 Solved: 363[Submit][Statu ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- 模式字符串匹配问题(KMP算法)
这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...
- Leetcode #28. Implement strStr()
Brute Force算法,时间复杂度 O(mn) def strStr(haystack, needle): m = len(haystack) n = len(needle) if n == 0: ...
- Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了
作者:Glowin链接:https://zhuanlan.zhihu.com/p/22881223来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:Google ...
- USACO chapter1
几天时间就把USACO chapter1重新做了一遍,发现了自己以前许多的不足.蒽,现在的程序明显比以前干净很多,而且效率也提高了许多.继续努力吧,好好的提高自己.这一章主要还是基本功的训练,没多少的 ...
- LintCode ---- 刷题总结
对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始).如果不存在,则返回 -1. 基本:两重for循 ...
- 九章lintcode作业题
1 - 从strStr谈面试技巧与代码风格 必做题: 13.字符串查找 要求:如题 思路:(自写AC)双重循环,内循环读完则成功 还可以用Rabin,KMP算法等 public int strStr( ...
随机推荐
- python的memcache使用如果对key设置了一个int型
如果对key设置了int型,会出现不可预知的错误,这个问题纠结了我好久,最终还是加了个str(),切忌切忌
- android应用程序的优先级
andorid系统为保障应用程序运行的流畅性,当内存资源比较匮乏的时候会杀死那些优先级比较低的进程 android进程的优先级如下图: 1.活动进程: 是指那些正在与用户进行交互的应用程序进程,这种组 ...
- php连接oracle
1.安装oracle客户端,不管是32位还是64位:当系统是32位的时候,要装32位的客户端,PL/SQL才能给连上数据库 2.php.ini中对应的oracle相关扩展打开.php_openssl. ...
- systemtap 技巧系列 +GDB
http://blog.csdn.net/wangzuxi/article/category/2647871
- phpcms 源码分析五:文件缓存实现
这次是逆雪寒的文件缓存实现代码分析: /* [/php] PHPCMS的文本缓存实现: [php] <?php /* 这个文件里面全是有关生成文本缓存的函数.文本缓存是个好东西.一般的项目,我们 ...
- mysql远程连接错误提醒:2013-Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
因为没有匹配/etc/hosts.allow. 解决方法: 1.在hosts.allow 文件中添加 mysqld:ALL [root@ucDB204 ~]# cat /etc/hosts.allow ...
- [整理]Oracle LOCK 机制
数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.锁机制用于管理对 ...
- maven项目转换成dynamic项目
由于maven项目不能直接运行调试需要转换成danamic web后,才能方便进行调试测试.以下是maven项目进行转换的过程 第一步,选择project faces,设置dynamic web版本. ...
- Windows redis集群搭建
一.Windows下Redis安装 下载地址https://github.com/dmajkic/redis/downloads,下载到的Redis支持32bit和64bit.根据自己实际情况选择,本 ...
- JQuery_AJAX简单笔记
<script type="text/javascript"> //Ajax方法 $.ajax({ type: "post", cache: fal ...