有趣的现象
查看原帖
有趣的现象
1379742
Xiaohaoyu1020明天见_xj楼主2024/12/8 17:11

我把两行代码的位置颠倒了一下就过了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
ll qmul(ull a,ull b,ll m){
    return (__int128)a*b%m;
}
ll qpow(ll a,ll p,ll m){
    ll res = 1,base = a;
    while(p){
        if(p & 1)res = qmul(res,base,m);
        base = qmul(base,base,m);
        p>>=1;
    }
    return res;
}
bool chk(long long a,long long d){
    long long p = d - 1;
    if(qpow(a,p,d) != 1)return 0;
    while(p % 2 == 0){
        p/=2;
        long long x = qpow(a,p,d);
        if(x == d-1)return 1;
        if(x != 1)return 0;
    }
    return 1;
}
long long ts[14] = {0,2,3,5,7,11,13,17,21,23,29,31,37,41};
bool miller(long long a){
    if(a > 40){
        for(int i = 1;i<=12;i++){
            if(!chk(ts[i],a)){
                return 0;
            }
        }
        return 1;
    }
    for(int i = 1;i<=12;i++){
        if(a == ts[i])return 1;
    }
    return 0;
}
long long f(long long a,long long c,long long m){
    return (qmul(a,a,m) + c)%m;
}
mt19937_64 mt;
long long pr(long long p){
    long long c = mt()%(p-1)+1,d = 1;
    long long sl = 0,fa = 0;
    int cnt = 0;
    long long val = 1;
    for(int goal = 1;;goal<<=1,sl = fa,val = 1){
        for(int i = 1;i<=goal;i++){
            fa = f(fa,c,p);
            val = qmul(val,abs(fa - sl),p);
            if(!val)return p;
            if(i % 127 == 0){
                long long d = __gcd(val,p);
                if(d > 1){
                    return d;
                }
            }
        }
        long long d = __gcd(val,p);
        if(d > 1){
            return d;
        }
    }
    return p;
}
long long max_factor = 1;
void solve(long long p){
    //cout<<p<<' '<<'\n';
    if(p <= max_factor)return;
    if(miller(p)){
        max_factor = p;
        return;
    }
    long long p1;
    while((p1 = pr(p)) >= p);
    while(p % p1 == 0)p/=p1;
    solve(p);// 在这!!!!!!!!!!!!!!!!
    solve(p1);
}
int main(){
    int T;
    cin>>T;
    while(T--){
        long long p;
        cin>>p;
        if(miller(p)){
            cout<<"Prime"<<'\n';
        }else{
            max_factor = 1;
            solve(p);
            cout<<max_factor<<'\n';
        }
    }
}

推测分解出的质因数较小,所以p产生的可能会更大从而使p1被剪掉

2024/12/8 17:11
加载中...