洛谷P4718 【模板】Pollard-Rho算法

虽然很久以前就听说过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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第10篇]RSA和强RSA问题有什么区别

这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于这样的假设,某些数学问题难以在有限的时间内解决.让我们看公钥(非对称)密码学,这也是这篇文章中我们使用的一个假设----**单向函数(O…

Palindrome subsequence HDU - 4632 区间dp|记忆化搜索

// 区间dpimport java.util.Scanner;/**** author CN*/ public class main {static int mod 10007;static String l;static int[][] dp new int[1010][1010];public static void main(String[] args){// TODO code application logic hereint t;Scanner sc new Scanner(Syst…

课外阅读(通讯技术的发展史)

课外阅读&#xff08;通讯技术的发展史&#xff09; 人们常把有线固定通信和无线移动通信作为信息基础结构&#xff08;NII/GII&#xff09;的两大组成部分。近年来它们都以明显的快速步伐向前推进&#xff0c;而且进入新世纪后将更加快速发展&#xff0c;为兴旺的信息时代作出…

python学习第19天

pass 转载于:https://www.cnblogs.com/heimajia/p/10636469.html

第十三期:你所了解的javascript?

在介绍JavaScript之前&#xff0c;首先让我们来简单了解一下脚本语言。大家知道&#xff0c;HTML通常用于格式化和链接文本&#xff0c;各种编程语言通常用于向机器发出一系列复杂的指令&#xff0c;而脚本语言是介于HTML和C、Java等编程语言之间的语言。脚本语言是一种简单的语…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第12篇]椭圆曲线上的群理论是什么

这是系列中的第12篇,我们继续数学背景的部分,通过介绍椭圆曲线的群理论… 椭圆曲线群定律是一种在一组椭圆曲线有理点中定义的二元操作来形成一个群的方法.现在,让我们看看到底什么意思,和这个东西怎么用 椭圆曲线和它的有理点 在椭圆曲线中加入群理论 这就是全部了吗 这和密…

python学习第22天

封装 properpty classmathod staticmathod 转载于:https://www.cnblogs.com/heimajia/p/10636515.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第13篇]概述投影点表达的用途的优点

这是52密码学系列中第13篇,我们继续数学背景部分,通过概述投影点表达的使用和优点. TLDR - 在椭圆曲线点上的翻倍和加法操作需要一个域取逆和几个乘法操作.我们考虑域K(特征值既不是2也不是3).给定K上的一个逆运算是比乘法更花费时间的,因此用投影点坐标去计算这些操作是更有效…

第七期:Python 从入门到精通:一个月就够了!

Python 从入门到精通&#xff1a;一个月就够了&#xff01; 对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握 Python 看似是一件十分困难的事。其实&#xff0c;只要掌握了科学的学习方法并制定了合理的学习计划&#xff0c;Python 从 入门到精通只需要一…

[Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 f(i,j) 表示 s 1的前 i个元素和 s2 的前 j个元素是否能交错组成 s3的前 i j 个元素 第 2 步&#xff1a;状态转移方程 p i j - 1 p为s3的长度 第 3 步&#xff1a;考虑初始化 boolean[][] f …

关于Windows下的访问控制模型

在探索Windows操作系统的过程中&#xff0c;发现很多有意思 的东西。 Windows下的访问控制模型也是我在Github上浏览代码时&#xff0c;无意中发现的。 项目地址 https://github.com/Krutonium/Windows-10-Login-Background-Changer 当我们登陆Windows操作系统时&#xff0c;系…

第八期:继美商务部拉黑多家中国公司后,MIT开始审查对华AI合作项目

10 月 9 日&#xff0c;美国麻省理工学院&#xff08;MIT&#xff09;表示&#xff0c;将审查学校与商汤科技&#xff08;SenseTime Group Ltd.&#xff09;的关系&#xff0c;包括一些可能涉及出口管制法规的项目。 北京时间 10 月 8 日&#xff0c;美国商务部正式公布了新一批…

Schrödinger's Knapsack ZOJ - 4019 线性DP

题意&#xff1a;有背包容量为c 给出两个数串 表示两种不同的物品 从物品中任意选多个数 价值是背包剩余空间*选择元素所属数串的系数 问 最大价值分析: 表面上看起来是个背包题 但是空间太大导致不能背 这里发现先放空间小的换来的价值大 所以我们应该先把两个数串排序 然后…

python学习笔记(十 三)、网络编程

最近心情有点儿浮躁&#xff0c;难以静下心来 Python提供了强大的网络编程支持&#xff0c;很多库实现了常见的网络协议以及基于这些协议的抽象层&#xff0c;让你能够专注于程序的逻辑&#xff0c;而无需关心通过线路来传输比特的问题。 1 几个网络模块 1.1 模块socket 网络编…

[Leetcode][第174题][JAVA][地下城游戏][DFS][动态规划]

【问题描述】[中等] 【解答思路】 1. 回溯&#xff08;暴力&#xff09;& 优化 超时&#xff0c;需要优化 public int calculateMinimumHP(int[][] dungeon) {if (dungeon null || dungeon.length 0 || dungeon[0].length 0) {return 0;}int rowLen dungeon.length;in…

第十期:快来了解这五种热门的开发技能

开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工作排行榜上名次靠前。随着企业对数字化转型项目的需求不断增加&#xff0c;对能够开发这些数字化应用软件的个人的需求随之而来。 开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工…

蓝桥杯 平方十位数

2017 国赛c/c B组填空题集合平方十位数由0~9这10个数字不重复、不遗漏&#xff0c;可以组成很多10位数字。这其中也有很多恰好是平方数&#xff08;是某个数的平方&#xff09;。比如&#xff1a;1026753849&#xff0c;就是其中最小的一个平方数。请你找出其中最大的一个平方数…

PHP常见面试题

1.mvc是什么?相互间有什么关系? 答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑 客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,…

第十一期:数据挖掘其实就是为了干这四种事?

数据挖掘主要侧重解决四类问题&#xff1a;分类、聚类、关联、预测。数据挖掘非常清晰的界定了它所能解决的几类问题。这是一个高度的归纳&#xff0c;数据挖掘的应用就是把这几类问题演绎的一个过程。 数据挖掘最重要的要素是分析人员的相关业务知识和思维模式。一般来说&…