如题,下载数据1后发现本地能跑,但是十分的慢。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const __int128 N=1e5+5,M=1e18;
__int128 sd2=3777777777ll;
int T,n;
__int128 f(__int128 mod){
return sd2=(sd2*sd2+rand())%mod;
}
__int128 qpow(__int128 x,__int128 p,__int128 MOD){
__int128 ret=1,base=x;
while(p){
if(p&1)ret=(ret*base)%MOD;
base=(base*base)%MOD;
p>>=1;
}
return ret;
}
bool miller_rabin(int x,int tms){
if(x==2)return true;
if(x%2==0)return false;
__int128 k=x-1,t=0;
while(k%2==0){
k/=2;
t++;
}
for(int i=1;i<=tms;i++){
__int128 a=rand()%(x-1)+1,b;
b=qpow(a,k,x);
for(int j=1;j<=t;j++){
if(b!=1 and b!=(x-1) and (b*b)%x==1){
return false;
}
b=(b*b)%x;
}
if(b!=1)return false;
}
return true;
}
__int128 arr[N],pos;
__int128 gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
__int128 pollard_rho(int xx){
sd2=rand();
__int128 step=1,val=sd2%xx,b=127,s=1;
pos=1;
for(;;){
// cerr<<step<<" "<<endl;
for(int i=1;i<=step;i++){
arr[pos]=(f(xx)-val+xx)%xx;
if((arr[pos]+val)%xx==val){
// cerr<<"***********************"<<endl;
step=1;
sd2=rand();
val=sd2%xx;
pos=1,s=1;
break;
}
s*=arr[pos];
s%=xx;
pos++;
if(pos>b){
val=(arr[pos-1]+val)%xx;
pos=1;
if(gcd(s,xx)>1){
for(int j=1;j<=b;j++){
if(gcd(arr[j],xx)>1)return gcd(arr[j],xx);
}
}
}
}
step*=2;
}
}
int mx=0;
void dfs(int x){
// cerr<<x<<" "<<mx<<endl;
// cerr<<miller_rabin(x,6)<<endl;
if(x<=mx||x<2)return;
if(miller_rabin(x,8)){
mx=max(mx,x);
return;
}
int tmp=x;
while(tmp>=x){
tmp=pollard_rho(x);
}
while(x%tmp==0){
x/=tmp;
}
dfs(x);dfs(tmp);
}
signed main(){
cin>>T;
srand(time(0));
while(T--){
cin>>n;
if(miller_rabin(n,8)){
puts("Prime");
}
else{
dfs(n);
cout<<mx<<endl;
mx=0;
}
}
return 0;
}```