【BZOJ3667】Rabin-Miller算法(Pollard_rho)

匿名 (未验证) 提交于 2019-12-03 00:39:02

呜,权限题,别问我是怎么做的(我肯定没有权限号啊)

第一行: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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!