题目链接

Pollard_Rho:http://blog.csdn.net/thy_asdf/article/details/51347390

#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
const int p[]={2,3,5,7,11,13,17,19};
typedef long long LL;
LL Ans; inline LL read()
{
LL now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline LL Mult(LL a,LL b,LL p)//O(1)快速乘
{
LL tmp=a*b-(LL)((long double)a/p*b+1e-8)*p;
return tmp<0?tmp+p:tmp;
}
LL Fast_Pow(LL n,LL k,LL p)
{
LL t=1;
for(;k;k>>=1,n=n*n%p)
if(k&1) t=t*n%p;
return t;
}
bool Miller_Rabin(LL n)
{
if(n==2) return 1;
if(!(n&1)||n==1) return 0;
for(int i=0;i<8;++i)
if(n==p[i]) return 1;
else if(!(n%p[i])) return 0;
LL u=n-1,now,las; int t=0;
while(!(u&1)) u>>=1,++t;
for(int i=0;i<8;++i)
{
now=Fast_Pow(p[i],u,n);
for(int j=1;j<=t;++j)
{
las=now, now=Mult(now,now,n);
if(now==1&&las!=1&&las!=n-1) return 0;
}
if(now!=1) return 0;
}
return 1;
}
LL gcd(LL x,LL y)
{
return y?gcd(y,x%y):x;
}
LL Rho(LL n,LL delta)
{//现要分解n,有两个随机数x,y,若p=gcd(x-y,n)!=1&&p!=n,那么p为n的一个约数...省略
LL x=rand()%n,y=x,p=1; int k=2;//设定k为此次路径长
for(int i=1;p==1;++i)
{
x=(Mult(x,x,n)+delta)%n;//随机函数f(x)=x*x+d
p=gcd(std::abs(x-y),n);//多次生成随机数,直至找到p是n的一个因子
if(i==k) y=x,k<<=1;//达到k次后把y赋值为x。路径每次倍长
}
return p;
}
void Find(LL n)
{
if(n==1) return;
if(Miller_Rabin(n)) {Ans=std::max(Ans,n);/*fac[++cnt]=n;*/ return;}
LL t=n;
while(t==n) t=Rho(n,rand()%(n-1)+1);
//t=n说明这个随机函数会导致走到n的环上,再换一个重试即可
Find(t), Find(n/t);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("3667.in","r",stdin);
#endif int t=read();LL n;
while(t--)
n=read(),Ans=0,Find(n),Ans==n?puts("Prime"):printf("%lld\n",Ans);
return 0;
}

最新文章

  1. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
  2. python :表单验证--对每一个输入框进行验证
  3. HTML5学习笔记简明版(1):HTML5介绍与语法
  4. [转] ICPC2013 World Finals赛后感
  5. &lt;PHP&gt;字符串处理代码
  6. xen之基本搭建
  7. A左右ndroid正在使用Uri监视数据库中的更改
  8. 前端学习——ionic/AngularJs——获取验证码倒计时按钮
  9. 初学jQuery之jQuery选择器
  10. svn基本操作和图标介绍
  11. 爱奇艺2018春招Java工程师编程题题解
  12. weblogic静默方式创建域
  13. Spark初步 从wordcount开始
  14. 【原创】Python第二章——字符串
  15. zip / unzip 的用法
  16. 第一天---关于环境和java基础
  17. CentOS中配置Kafka集群
  18. Linux内核学习总结(final)
  19. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
  20. 【12】FtpWebRequest上传下载

热门文章

  1. SciPy模块应用
  2. caffe中 softmax 函数的前向传播和反向传播
  3. linux关机时候执行命令脚本或程序
  4. 出现“error LNK1169: 找到一个或多个多重定义的符号”的原因
  5. zabbix常见报错问题处理
  6. 电信运营商 IT 系统介绍
  7. Android命令Monkey压力测试,详解
  8. 【linux】crontab失效
  9. 性能测试十二:jmeter进阶之java请求参数化
  10. [颜色知识] 潘通色卡、CMYK、RGB、 ARGB...