Pollard-Rho && Miller Rabin
-
注意中途要开
__int128
-
求一个数是否为质数或者最大的质因数
#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace IO{
#define ll long long
#define db double
#define FLS fflush(stdout)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
inline int max(int a,int b) {return (a>b)?a:b;}
inline int min(int a,int b) {return (a<b)?a:b;}
inline ll ksm(ll a,int b,int mod) {ll res=1;while(b) {if(b&1) res=(__int128)res*a%mod;a=(__int128)a*a%mod;b>>=1;}return res;}
char buf[1<<21],*p1=buf,*p2=buf;
#define Fin(a) freopen(a".in","r",stdin)
#define Fout(a) freopen(a".out","w",stdout)
inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline int read(){
int ret=0;bool f=0;char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
return f?-ret:ret;
}
}using namespace IO;
int n,maxpri,t,k;
inline int mr(int p,int x) {
int a=ksm(x,t,p);
FOR(j,1,k) {
int nxt=(__int128)a*a%p;
if(nxt==1 && (a!=1 && a!=p-1)) return 0;
a=nxt;
}
if(a!=1) return 0;
return 1;
}
inline int check(int x) {
if(x<2) return 0;
t=x-1,k=0;
while(!(t&1)) t>>=1,++k;
if(x==2 || x==3 || x==5 || x==7 || x==61) return 1;
return mr(x,2) && mr(x,97) && mr(x,61) && mr(x,577) && mr(x,137);
}
inline int f(int x,int c,int mod) {
return ((__int128)x*x+c)%mod;
}
int gcd(int x,int y) {return (!y)?x:gcd(y,x%y);}
inline int pr(int x) {
int c=rand()%(x-1)+1,s=0,t=0;
int val=1;
for(int i=1;;i<<=1,s=t,val=1) {
FOR(j,1,i) {
t=f(t,c,x);
val=(__int128)val*abs(t-s)%x;
if(j%127==0) {
int d=gcd(val,x);
if(d>1) return d;
}
}
int d=gcd(val,x);
if(d>1) return d;
}
}
void fac(int x) {
if(x<=maxpri || x<2) return ;
if(check(x)) {
if(x>maxpri) return maxpri=x,void();
else return ;
}
int y=x;
while(y>=x) {
y=pr(x);
}
while(x%y==0) x/=y;
fac(x);fac(y);
}
inline void solve() {
cin>>n;
maxpri=0;
fac(n);
if(maxpri==n) cout<<"Prime"<<endl;
else cout<<maxpri<<endl;
}
signed main(){
#ifdef LOCAL
Fin("P4718_14");
Fout("1");
#endif
srand((unsigned)time(0));
int T;cin>>T;
while(T--) solve();
#ifdef LOCAL
fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探