虽然很久以前就听说过PR算法,但前几天第一次打。

首先miller rabin判断素数,不在复杂度瓶颈。
pollard rho倍增环长,复杂度是\(O(n^{\frac{1}{4}} log n)\)的。
然而这样复杂度较高,比较难过加强后的数据。

可以考虑每次倍增时把乘积存下来,然后在增加环长时一次gcd,这样应该是\(O(n^{\frac{1}{4}})\)

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")#include <bits/stdc++.h>
using namespace std;
typedef long long i64;
typedef unsigned long long u64;
typedef vector<i64> vi64;
i64 fast_pow(i64 x,i64 y,i64 z){//cerr<<"fp"<<x<<" "<<y<<" "<<z<<endl;i64 ret=1;for (; y; y>>=1,x=(__int128)x*x%z)if (y&1) ret=(__int128)ret*x%z;return ret;
}
u64 RAND(){return ((u64)rand()*rand()+rand());
}
const int sp[]={2,3,5,7,11,13,17,19,23,29,31,37,43,47};
bool is_prime(i64 n){//cerr<<"is_prime"<<n<<endl;if (n==2) return 1;if (~n&1) return 0;i64 u=n-1;int b=0;while (~u&1){u>>=1;++b;}for (int i=0; i<12&&sp[i]<n; ++i){i64 now=fast_pow(sp[i],u,n),la=now;//cerr<<a<<" "<<u<<" "<<now<<" "<<i<<endl;if (now!=1)for (int i=1; i<=b; ++i){now=(__int128)now*now%n;if (now==1){if (la!=n-1) return 0;break;}la=now;}//cerr<<"now"<<now<<endl;if (now!=1) return 0;}return 1;
}
i64 fix(i64 a,i64 n){return a<0?a+n:a;
}
i64 gcd(i64 a,i64 b){int shift=__builtin_ctzll(a|b);b>>=__builtin_ctzll(b);while (a){a>>=__builtin_ctzll(a);if (a<b) swap(a,b);a-=b;}return b<<shift;
}
i64 pollard_rho(i64 n,i64 c){//cerr<<"pollard_rho"<<n<<" "<<c<<endl;i64 i=1,k=2,x=RAND()%(n-1)+1,y=x,g=1;while (1){++i;x=((__int128)x*x+c)%n;//i64 tmp=gcd(fix(x-y,n),n);//cerr<<x<<" "<<y<<endl;//if (tmp>1) return tmp;g=(__int128)fix(x-y,n)*g%n;if (i==k){g=gcd(g,n);if (g>1){if (g==n){x=y;while (g==1){x=((__int128)x*x+c)%n;g=gcd(fix(x-y,n),n);}}return g;}y=x;k<<=1;}}
}
vi64 v;
void fj(i64 n){if (n==1) return;if (is_prime(n)){//cerr<<"N"<<n<<endl;v.push_back(n);return;}i64 p=n;while (p>=n){p=pollard_rho(n,RAND()%n);}fj(p);fj(n/p);
}
typedef vector<pair<i64,int> > vpi64i;
vpi64i vv;
int k,p;
int fp(int x,int y){int ret=1;for (; y; y>>=1,x=(i64)x*x%p) if (y&1) ret=(i64)ret*x%p;return ret;
}
int C(int x){return ((u64)x*(x+1)>>1)%p;
}
int mul(int x,int y){return (i64)x*y%p;
}
int add(int x,int y){return (x+=y)>=p?x-p:x;
}
int main(){int t;cin>>t;while (t--){i64 n;cin>>n;//FastDiv fd(p);if (n==1){cout<<1<<'\n';continue;}v.clear();fj(n);sort(v.begin(),v.end());(v.back()==n?cout<<"Prime":cout<<v.back())<<'\n';}
}

转载于:https://www.cnblogs.com/Yuhuger/p/10634343.html

洛谷P4718 【模板】Pollard-Rho算法相关推荐

  1. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  2. 大整数分解——Pollard Rho算法

    延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...

  3. c语言用rho函数求复数模长,Pollard Rho 算法简介

    $\text{update 2019.8.18}$ 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点图. ...

  4. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  5. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  6. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  7. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  8. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  9. 洛谷P3371-【模板】单源最短路【SPFA】

    题目 一个有向图,求一点到所有点的最短距离 输入 4 6 1(4个点,6条边,从1出发) 1 2 2(1点到2点有一条权值2的线) 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出 0 ...

最新文章

  1. python使用正则化检查字符串的起始和结束字符相同
  2. 【Linux系统编程】进程间通信--有名管道
  3. Java基础 —— 变量,选择,循环,数组,输入与输出等
  4. 单模单纤光纤收发器指示灯及故障问题详解
  5. 前端学习(3083):vue+element今日头条管理-表单数据绑定
  6. from表单iframe原网页嵌入
  7. spring boot 配置 druid的filters时报错 Reason: org.apache.log4j.Priority
  8. 4.nslookup
  9. 由pushViewController说起可能出线的各种死法
  10. 2011年10月14日22:40,“你在哪(where are you)”诞生
  11. 软件设计 -- 数据流图,数据字典,ER图
  12. android个人理财通项目_基于Android个人理财系统设计与实现.doc
  13. 扣扣浏览器mini java_WebQQ Mini各种浏览器试用
  14. 云笔记的使用感受和选择
  15. 计算机体系层次图中 虚拟机属于,第1章 计算机系统概述.ppt
  16. chromedriver下载与安装方法
  17. AUTOSAR架构学习之EcuM
  18. 招行推出智能投顾服务“摩羯智投”
  19. steam吃鸡登录显示错误服务器目前繁忙,steam服务器繁忙
  20. css三列布局--两边固定中间自适应和中间固定两边自适应

热门文章

  1. 实例52:python
  2. Ubuntu 和 Centos 的一点差别
  3. C++ 判断系统大小字节序
  4. 洛谷 3381 【模板】最小费用最大流
  5. java io之图片存取
  6. gesturedetector.java_我的flutter代码中的GestureDetector不起作用
  7. 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址随便造成的。请稍候重试。 .
  8. linux部署jenkins,tomcat9
  9. AppTheme 属性详解
  10. nuxt route 全局管理 route.beforeEach 替代