P4718-[模板]Pollard-Rho算法

正题

题目链接:https://www.luogu.com.cn/problem/P4718


题目大意

给出一个数nnn,如果它是质数则输出PrimePrimePrime,否则输出它的最大质因子。


解题思路

Pollard-Rho\text{Pollard-Rho}Pollard-Rho算法的前置知识是Miller-Rabin\text{Miller-Rabin}Miller-Rabin。在使用Miller-Rabin\text{Miller-Rabin}Miller-Rabin判掉质数之后,Pollard-Rho\text{Pollard-Rho}Pollard-Rho使用基于随机的思想能够较快的求出一个大数的因子之一。

朴素的随机算法就是随机一个数判断它是不是因子,我们先使用一个较为优秀的随机方式,f(x)=f(x−1)2+cf(x)=f(x-1)^2+cf(x)=f(x1)2+c(其中ccc为一个常数)。

然后我们利用在这个函数上“跑”的距离来判断,也就是每次拿某两个i,ji,ji,j,判断∣f(i)−f(j)∣|f(i)-f(j)|f(i)f(j)是否为它的因数。

但是如果枚举的话fff函数上会出现一些“环”,我们需要快速的判掉“环”的方法。每次拿s,ts,ts,t,令t=2st=2st=2s,若环长为ccc,那么有f(x)=f(x+c)f(x)=f(x+c)f(x)=f(x+c),当某一时刻f(t)=f(s)f(t)=f(s)f(t)=f(s)那么环长一定是sss的整数倍。

然后判到环就退出,如果没有找到就换一个常数重新做,这样的我们的算法雏形就形成了。

但是这样还是跑的很慢,发现我们在过程中大量调用了gcd(d,p)gcd(d,p)gcd(d,p)导致时间变慢。考虑优化,我们可以每次先做一堆,然后在把这一堆拿过去一起搞定。首先我们有gcd(ac,b)=gcd(a,b)gcd(ac,b)=gcd(a,b)gcd(ac,b)=gcd(a,b),然后根据gcdgcdgcd的原理,我们有gcd(a,b)=gcd(a%b,b)gcd(a,b)=gcd(a\% b,b)gcd(a,b)=gcd(a%b,b)那么也就是我们有gcd(a,b)=gcd(ac%b,b)gcd(a,b)=gcd(ac\%b,b)gcd(a,b)=gcd(ac%b,b)

那么假设我们有若干个间隔a1,a2,a3,...a_1,a_2,a_3,...a1,a2,a3,...那么我们把这数乘起来模ppp,然后把得到的结果kkkpppgcdgcdgcd就等价于拿aaa中逐个取与pppgcdgcdgcd

所以我们的优化方法就是第iii次拿2i2^i2i个间隔去一起与ppp判断,但是因为iii后面会很大导致副作用,所以将iii设一个上界888即可。
时间复杂度期望是O(n2.5)O(n^{2.5})O(n2.5),但跑的飞快

回到这题来,我们先对nnnMR\text{MR}MR判断一次质数,然后跑Pr\text{Pr}Pr弄出一个因子ddd,之后将nnn的因子ddd都去光后分别把nnnddd丢下去递归继续跑。可以记录一个目前最大质因子来剪去一些不优状态。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
const ll pri[10]={2,3,5,7,11,13,17,19,23,27};
ll T,n,ans;
ll ksc(ll a,ll b,ll p){ll c=(long double)a*b/p;long double ans=a*b-c*p;if(ans<0)ans+=p;else if(ans>=p)ans-=p;return ans;
}
ll power(ll x,ll b,ll p){ll ans=1;while(b){if(b&1)ans=ksc(ans,x,p);x=ksc(x,x,p);b>>=1;}return ans;
}
bool Mr(ll p){if(p==2)return 1;if(p<2||!(p&1))return 0;ll t=p-1,s=0;while(!(t&1))t>>=1,s++;for(ll i=0;i<10&&pri[i]<p;i++){ll x=power(pri[i],t,p),k;for(ll j=0;j<s;j++){k=ksc(x,x,p);if(k==1&&x!=1&&x!=p-1)return 0;x=k;}if(x!=1)return 0;}return 1;
}
ll gcd(ll a,ll b)
{return (!b)?a:gcd(b,a%b);}
ll Pr(ll p){ll s=0,t=0,c=1ll*rand()%(p-1)+1;for(ll g=1,val=1,d;;g<<=1,s=t,val=1){for(ll j=0;j<g;j++){t=(ksc(t,t,p)+c)%p;val=ksc(val,abs(t-s),p);if(j%127==0&&(d=gcd(p,val))>1)return d;}d=gcd(p,val);if(d>1)return d;}return p;
}
void solve(ll n){if(n<ans||n<2)return;if(Mr(n)){ans=n;return;}ll d=0;while((d=Pr(n))>=n);while(n%d==0)n/=d;solve(n);solve(d);return;
}
signed main()
{srand(998244353);scanf("%lld",&T);while(T--){scanf("%lld",&n);if(Mr(n)){printf("Prime\n");continue;}ans=0;solve(n);printf("%lld\n",ans);}return 0;
}

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

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

相关文章

T-Dongle-S3开发笔记——创建工程

创建Hello world工程 打开命令面板 方法1&#xff1a;查看->命令面板 方法2&#xff1a;按F1 选择ESP-IDF:展示示例项目 创建helloworld 选择串口 选择芯片 至此可以编译下载运行了 运行后打印的信息显示flash只有2M。但是板子上电flash是W25Q32 4MB的吗 16M-bit

hdu 1576 A/B

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;hdu 1576题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。…

ASP.NET Core 中断请求了解一下(翻译)

本文所讲方式仅适用于托管在Kestrel Server中的应用。如果托管在IIS和IIS Express上时&#xff0c;ASP.NET Core Module(ANCM)并不会告诉ASP.NET Core在客户端断开连接时中止请求。但可喜的是&#xff0c;ANCM预计在.NET Core 2.2中会完善这一机制。1. 引言假设有一个耗时的Act…

子数整数(luogu 1151)

子数整数 luogu 1151 题目大意 给出一个数k&#xff0c;让你在10000~30000中求出满足前三位&#xff0c;中间三位&#xff0c;后三位都可被k整除的数 输入样例 15输出样例 22555 25555 28555 30000数据范围 0<k<1000 解题思路 暴力枚举 代码 #include<cstd…

2021-10-22

扫描线&#xff1a; https://www.cnblogs.com/Parsnip/p/10887135.html https://blog.csdn.net/Emma2oo6/article/details/120584307 https://blog.csdn.net/weixin_30609331/article/details/96234492 LIS& LCS https://www.xuebuyuan.com/586419.html https://blog.csdn…

.net core实践系列之短信服务-架构优化

前言通过前面的几篇文章&#xff0c;讲解了一个短信服务的架构设计与实现。然而初始方案并非100%完美的&#xff0c;我们仍可以对该架构做一些优化与调整。同时我也希望通过这篇文章与大家分享一下&#xff0c;我的架构设计理念。源码地址&#xff1a;https://github.com/SkyCh…

Poj 1061 青蛙的约会

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 143491 Accepted: 33018 Description 文章目录题目&#xff1a;思路:代码:题目传送题目&#xff1a; 两只青蛙在网上相识了&#xff0c;它们聊得很开心&#xff0c;于是觉得很有必要见一面。它们很高兴地发现它们住…

P3649-[APIO2014]回文串【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3649 题目大意 一个字符串&#xff0c;求最大的回文串长度出现次数 解题思路 构建出PAM\text{PAM}PAM然后统计一下每个节点作为后缀的次数&#xff0c;failfailfail树上上传一下信息就好了&#xff0c;时间复杂度O(n)O(n)O…

【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)

拉格朗日插值 luogu 4781 金牌导航 拉格朗日插值-1 题目大意 给出n个点&#xff0c;让你确定经过这n个点且不超过n-1次的方程&#xff0c;现在给出k&#xff0c;让你求出其函数值 样例#1 输入样例#1 3 100 1 4 2 9 3 16输出样例#1 10201样例#2 输入样例#2 3 100 1 1 …

游戏 (博弈论)

https://blog.csdn.net/Mys_C_K/article/details/91443390

.NET Core中Object Pool的简单使用

前言复用&#xff0c;是一个重要的话题&#xff0c;也是我们日常开发中经常遇到的&#xff0c;不可避免的问题。举个最为简单&#xff0c;大家最为熟悉的例子&#xff0c;数据库连接池&#xff0c;就是复用数据库连接。那么复用的意义在那里呢&#xff1f;简单来说就是减少不必…

数论 欧几里得与扩展欧几里得

欧几里得算法&#xff1a; 求a&#xff0c;b的最大公约数 gcd&#xff08;a,b&#xff09; gcd(b,a%b) ll gcd(ll a,ll b) {return b0?a:gcd(b,a%b); }扩展欧几里得算法&#xff1a; 如果a&#xff0c;b是整数&#xff0c;一定存在x和y使得axbygcd&#xff08;a&#xff0c…

P4173-残缺的字符串【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P4173 题目大意 给出两个字符串S,TS,TS,T&#xff0c;其中包含小写字母和一些???&#xff0c;???可以匹配任何字符。 求有多少个ppp使得T0∼∣t∣−1Sp∼p∣t∣−1T_{0\sim |t|-1}S_{p\sim p|t|-1}T0∼∣t∣−1​Sp∼…

转圈游戏(luogu 1965)

转圈游戏 luogu 1965 题目大意 求(xm10k)%n(x m\times 10^k)\%n(xm10k)%n 输入样例 10 3 45输出样例 5数据范围 1<n<10000000<m<n,1⩽x⩽n,0<k<1091<n<10000000<m<n,1\leqslant x\leqslant n,0<k<10^91<n<10000000<m<n…

.Net Core应用框架Util介绍(三)

上篇.Net Core应用框架Util介绍&#xff08;二&#xff09;介绍了Util的开发环境&#xff0c;并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。目录结构在VS上打开Util Demo&#xff0c;会看见如下的目录结构。现代前端通常采用VS Code开发&#xf…

【DP】字串距离(luogu 1279)

字串距离 luogu 1279 题目大意 给出两个字符串&#xff0c;让你加上若干空格&#xff0c;使其长度相同 对于第i位&#xff0c;如果都是字母那代价就是ASCII码的差值&#xff0c;如果一个是字母那就是k&#xff0c;如果没有一个是字母那就是0&#xff0c;让你求最小代价 输入…

hdu 1525 Euclid‘s Game

hdu 1525 文章目录Problem Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two n…

P4351-[CERC2015]Frightful Formula【组合数学,MTT】

正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 n∗nn*nn∗n的矩形&#xff0c;给出第一行和第一列的数&#xff0c;剩下的满足Fi,ja∗Fi,j−1b∗Fi−1,jcF_{i,j}a*F_{i,j-1}b*F_{i-1,j}cFi,j​a∗Fi,j−1​b∗Fi−1,j​c 求Fn,nF_{n,n}Fn,n​ 解题思路 第…

阶乘幂与有限微积分

定义 差分算子Δ\DeltaΔ&#xff1a;Δf(x)f(x1)−f(x)\Delta f(x)f(x1)-f(x)Δf(x)f(x1)−f(x)平移算子EEE&#xff1a;Ef(x)f(x1)E f(x)f(x1)Ef(x)f(x1)下降幂&#xff1a;n>0,{xn‾x(x−1)(x−2)...(x−n1)x−n‾1(x1)(x2)(x3)...(xn)n>0,\begin{cases}x^{\underlin…

【Floyd】灾后重建(luogu 1119)

灾后重建 luogu 1119 题目大意 给你一个图&#xff0c;每个点在一定时间后才能被通过&#xff0c;问在某个时间&#xff0c;两个点之间的最短路 输入样例 4 5 1 2 3 4 0 2 1 2 3 1 3 1 2 2 1 4 0 3 5 4 2 0 2 0 1 2 0 1 3 0 1 4输出样例 -1 -1 5 4数据范围 N⩽200&#x…