今天估计我是脑残了才会来写这道题。。现在还在TLE中。。。用了miller_rabbin和pollard_rho其实到现在我也不太清楚pollard_rho是如何实现的。。。只是这道题真的好综合啊。。。而且好难啊。。。不会不会!!!!为毛我的代码现在还是TLE。。。
附上代码:(我实在是做不动了。。。)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int a[64];
long long x[70];
long long gcd(long long x,long long y){
if(y==0){
return x;
}
else
return gcd(y,x%y);
}
long long pollard_rho(long long n){
long long i=1;
x[1]=2;
long long y=x[1];
long long k=2;
long long d=1;
while(i<=70){
i=i+1;
x[i]=(x[i-1]*x[i-1]-1)%n;
if(y-x[i]>=0){
d=gcd(y-x[i],n);
}
else{
d=gcd(x[i]-y,n);
}
if(d!=1 && d!=n && d!=0)
return d;
if(i==k){
y=x[i];
k=2*k;
}
}
return d;
}
int f(long long n){
int k=0;
while(n){
a[k++]=n%2;
n=n/2;
}
return k;
}
long long modular_exp(long long b,long long n,long long m){
long long x=1;
long long power=b%m;
int k=f(n),i;
for(i=0;i<=k-1;i++){
if(a[i]==1)x=(x*power)%m;
power=(power*power)%m;
}
return x;
}
int miller_rabbin(long long n){
long long i,a;
for(i=1;i<=1000000;i++){
a=i;
if(modular_exp(a,n-1,n)!=1){
return a;
}
}
return 1;
}
main(){
int t,k,i;
long long n,min=-1,m;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
k=miller_rabbin(n);
if(k==1 || k==n)
printf("Prime\n");
else{
if(n%2==0)
printf("2\n");
else{
min=pollard_rho(n);
m=min;
n=n/m;
k=miller_rabbin(n);
while(!(k==1 || k==n)){
m=pollard_rho(n);
if(m<=min)
min=m;
n=n/m;
k=miller_rabbin(n);
}
printf("%lld\n",min);
}
}
}
}