TLE 15pts 求调
查看原帖
TLE 15pts 求调
892979
liuenyin楼主2025/1/23 13:21

如题,下载数据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;
}```
2025/1/23 13:21
加载中...