【BZOJ-3667】Rabin_Miller算法 随机化判素数
3667: Rabin-Miller算法
Time Limit: 60 Sec Memory Limit: 512 MB
Submit: 983 Solved: 302
[Submit][Status][Discuss]
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
Solution
我以为啊,这个Discuss很好
裸题,卡常..自己原来的板子被卡死了..于是换成网上的新版...
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
long long read()
{
long long x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
long long X,maxz;
long long gcd(long long a,long long b)
{
if (b==) return a;
return gcd(b,a%b);
}
//long long mul(long long a,long long b,long long p)
//{
// if (b==0) return 0; if (b==1) return a%p;
// long long re;
// re=mul(a,b>>1,p);
// if ((b&1)==1) return (re+re+a)%p;
// else return (re+re)%p;
//}
long long mul(long long a,long long b,long long p)
{
long long tmp=(a*b-(long long)((long double)a/p*b+1e-)*p);
return tmp<?tmp+p:tmp;
}
long long quick_pow(long long a,long long b,long long p)
{
long long ans=; a%=p;
for (long long i=b; i; i>>=,a=mul(a,a,p))
if (i&) ans=mul(ans,a,p);
return ans;
}
bool check(long long a,long long n,long long r,long long s)
{
long long ans=quick_pow(a,r,n),p=ans;
for(int i=; i<=s; i++)
{
ans=mul(ans,ans,n);
if(ans==&&p!=&&p!=n-)return ;
p=ans;
}
if(ans!=)return ;else return ;
}
bool Robin_Miller(long long x)
{
if(x<=) return ;
if(x==) return ;
if(x%==) return ;
long long r=x-,s=;
while(r%==) r/=,s++;
for(int i=; i<; i++)
if(check(rand()%(x-)+,x,r,s))
return ;
return ;
}
long long Rho(long long x,long long t)
{
long long k=,a=rand()%x,b=a,p=;
for(long long i=; p==; i++)
{
a=(mul(a,a,x)+t)%x;
p=b>a?b-a:a-b;
p=gcd(x,p);
if(i==k) b=a,k+=k;
}
return p;
}
void work(long long x)
{
if(x==) return;
if(Robin_Miller(x)){maxz=max(x,maxz);return;}
long long t=x;
while(t==x) t=Rho(x,rand()%(x-)+);
work(t); work(x/t);
}
int main()
{
int n;n=read();
while (n--)
{
X=read(); maxz=;
work(X);
if (maxz==X) puts("Prime");
else printf("%lld\n",maxz);
}
return ;
}
论常数的差距....:So SAD.
【BZOJ-3667】Rabin_Miller算法 随机化判素数的更多相关文章
- Miller_raibin算法随机化检测素数 & Pollar_rho 算法分解大数
这几天一直再学习这些内容,也没有发一些博客,现在我觉得差不多了 首先基础是Miller_raibin随机化检测素数,顾名思义,随机化也就是有几率不对,但是很低,适用于大数快速检测,因为大数已经超出了我 ...
- 【刷题】BZOJ 3667 Rabin-Miller算法
Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如 ...
- BZOJ.3667.Rabin-Miller算法(MillerRabin PollardRho)
题目链接 Pollard_Rho:http://blog.csdn.net/thy_asdf/article/details/51347390 #include<cstdio> #incl ...
- bzoj 3667 Rabin-Miller算法
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...
- bzoj 3667: Rabin-Miller算法【Miller-Rabin】
Miller-Rabin模板 #include<iostream> #include<cstdio> #include<algorithm> using names ...
- BZOJ 3667: Rabin-Miller算法 (Pollard-Rho 模板)
说实话,我知道每一步都干啥,但我完全不知道为啥这么做,也不知道为什么是正确的,反正会用就行了~ #include <cmath> #include <cstdio> #incl ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...
- UVA10200-Prime Time/HDU2161-Primes,例题讲解,牛逼的费马小定理和欧拉函数判素数。
10200 - Prime Time 此题极坑(本菜太弱),鉴定完毕,9遍过. 题意:很简单的求一个区间 ...
随机推荐
- 窗口 - dialog - 与后端交互
与后端交互,一般需要提交表单数据,所以,这次渲染得dialog其实是一个<form> <form id="loginForm"> <table ali ...
- 理解IEnumerator+IEnumerable这种接口思想
前言 本文不想过多篇幅来介绍IEnumerator和IEnumerable这两个接口的具体说明,只是把它作一个例子作引言而已,本文将根据自己的理解来描述微软为何要这样设计这种关联风格的接口.这种风格的 ...
- 异步dcfifo的读写
异步dcfifo的原理 Dcfifo即是Double clk fifo,意思是双时钟的fifo.或许你现在还不知道什么是fifo,那我就先从fifo(就是同步fifo,不过同步fifo在实际运用中比较 ...
- NetFPGA
From Wikipedia, the free encyclopedia The NetFPGA project[1] is an effort to develop open source har ...
- SQL复杂查询和视图(2)
分组查询 SQL可以将检索到的元组按某一条件进行分组,分组是属性值相同的为一组 求每个学生的平均成绩 SELECT sn,AVG(score)FROM scGROUP BY sn 先按sn进行分组,即 ...
- js中递归函数的使用介绍
所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示: ...
- The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path。
项目上右键-->Build Path-->Configuration Build Path -->Add Library -->Server Runtime 选择tomcat
- 1-mkdir 命令总结
mkdir make directories 创建目录 [语法]: ls [选项] [参数] [功能介绍] mkdir命令用来创建目录.该命令创建由dirname命名的目录.如果在目录名的前面没有加任 ...
- directly receive json data from javascript in mvc
if you send json data to mvc,how can you receive them and parse them more simply? you can do it like ...
- springMvc对json的支持
实体类: public class User { private String id; //有这个注解的属性,不会转换为json @JsonIgnore private String name; .. ...