我把两行代码的位置颠倒了一下就过了
#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被剪掉