呜,权限题,别问我是怎么做的(我肯定没有权限号啊)
第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime
第二,如果不是质数,输出它最大的质因子是哪个。
\(Pollard\_rho\)的模板题,权限题什么的烦死了。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define ll long long #define RG register inline ll read() { RG ll x=0,t=1;RG char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } ll e,N,c; ll Multi(ll a,ll b,ll MOD) { ll s=0; while(b){if(b&1)s=(s+a)%MOD;a=(a+a)%MOD;b>>=1;} return s; } ll fpow(ll a,ll b,ll MOD) { ll s=1; while(b){if(b&1)s=Multi(s,a,MOD);a=Multi(a,a,MOD);b>>=1;} return s; } bool Miller_Rabin(ll x) { if(x==2)return true; for(int tim=10;tim;--tim) { ll a=rand()%(x-2)+2; if(fpow(a,x-1,x)!=1)return false; ll p=x-1; while(!(p&1)) { p>>=1;ll nw=fpow(a,p,x); if(Multi(nw,nw,x)==1&&nw!=1&&nw!=x-1)return false; } } return true; } ll Pollard_rho(ll n,int c) { ll i=0,k=2,x=rand()%(n-1)+1,y=x; while(233) { ++i;x=(Multi(x,x,n)+c)%n; ll d=__gcd((y-x+n)%n,n); if(d!=1&&d!=n)return d; if(x==y)return n; if(i==k)y=x,k<<=1; } } vector<ll> fac; void Fact(ll n,int c) { if(n==1)return; if(Miller_Rabin(n)){fac.push_back(n);return;} ll p=n;while(p>=n)p=Pollard_rho(n,c--); Fact(p,c);Fact(n/p,c); } int main() { int T=read(); while(T--) { ll n=read();fac.clear();Fact(n,233); sort(fac.begin(),fac.end()); if(fac.size()==1)puts("Prime"); else printf("%lld\n",fac[fac.size()-1]); } return 0; }
原文:https://www.cnblogs.com/cjyyb/p/9251195.html