BZOJ3667: Rabin-Miller算法
时间:2022-05-08
本文章向大家介绍BZOJ3667: Rabin-Miller算法,主要内容包括Description、Input、Output、Sample Input、Sample Output、HINT、Source、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
Description
Input
第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个。
Output
第一行CAS(CAS<=350,代表测试数据的组数) 以下CAS行:每行一个数字,保证是在64位长整形范围内的正数。 对于每组测试数据:输出Prime,代表它是质数,或者输出它最大的质因子,代表它是和数
Sample Input
6 2 13 134 8897 1234567654321 1000000000000
Sample Output
Prime Prime 67 41 4649 5
HINT
数据范围: 保证cas<=350,保证所有数字均在64位长整形范围内。
Source
rho的裸题
注意这题卡log{n}的快速乘
参考了一下黄学长的,Get到了$O(1)$快速乘的骚操作:grin:
详细见代码吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#define LL long long
using namespace std;
const LL MAXN=2*1e7+10;
const LL INF=1e7+10;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline LL read()
{
char c=nc();LL x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}
return x*f;
}
LL mx=0;
LL num[15]={2,3,5,7,11,13,17,19};
LL fastmul(LL a,LL b,LL p)
{
LL tmp=(a*b-(LL)((long double)a/p*b+1e-8)*p);
return tmp<0?tmp+p:tmp;
}
LL fastpow(LL a,LL p,LL mod)
{
LL base=1;
while(p)
{
if(p&1) base=(base*a)%mod;
a=(a*a)%mod;
p>>=1;
}
return base;
}
bool MR(LL n)
{
if(n==2) return 1;
for(LL i=0;i<8;i++) if(n==num[i]) return 1;
if(n==1||( (n&1)==0)) return 0;
LL temp=n-1,t=0;
while( (temp&1)==0) temp>>=1,t++;
for(LL o=0;o<8;o++)
{
LL a=num[o];
LL now=fastpow(a,temp,n),nxt=now;
for(LL i=1;i<=t;i++)
{
nxt=fastmul(now,now,n);
if(nxt==1&&now!=1&&now!=n-1) return 0;
now=nxt;
}
if(now!=1) return false;
}
return 1;
}
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
LL rho(LL n,LL c)
{
LL x=rand()%n,y=x,k=2,p=1;
for(LL i=1;p==1;i++)
{
x=( fastmul(x,x,n)+c )%n;
p=gcd(abs(y-x),n);
if(i==k) y=x,k+=k;
}
return p;
}
void find(LL now)
{
if(now==1) return ;
if(MR(now)) {mx=max(mx,now);return ;}
LL t=now;
while(t==now)
t=rho(now,rand()%(now-1)+1);//未找到因子之前无限递归
find(t);
find(now/t);
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
LL N=read();
while(N--)
{
mx=0;
LL p=read();
find(p);
if(mx==p) printf("Primen");
else printf("%lldn",mx);
}
return 0;
}
- Centos7下部署两套python版本并存环境的操作记录
- MapX中取得图元操作的速度测试
- FluorineFx:基于RSO(远程共享对象)的文本聊天室
- 扫盲文章:AMF,RTMP,RTMPT,RTMPS
- "操作必须使用一个可更新的查询"问题
- 利用fluorineFx将DataTable从.Net传递到Flash
- Linux服务器性能压力测试
- linq to sql中的自动缓存(对象跟踪)
- php5.6安装Zend Opcache扩展
- 图片相似检测:三行代码实现
- Gitlab备份和恢复操作记录
- 利用图形界面对Sql2008做日志收缩
- 值得关注的5个Python开源项目
- 使用Docker三剑客部署集群
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php使用filter_var函数判断邮箱,url,ip格式示例
- Python json格式化打印实现过程解析
- PHP使用DOM对XML解析处理操作示例
- OpenCV Python实现图像指定区域裁剪
- Laravel框架实现多个视图共享相同数据的方法详解
- python如何快速生成时间戳
- 从python读取sql的实例方法
- PHP+iframe模拟Ajax上传文件功能示例
- Centos7 Yum安装PHP7.2流程教程详解
- PHP session垃圾回收机制实例分析
- thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
- Python常用库Numpy进行矩阵运算详解
- PHP设计模式之建造者模式(Builder)原理与用法案例详解
- PHP大文件切割上传并带进度条功能示例
- PHP设计模式之观察者模式入门与应用案例详解