样例过了自己试验了几组数据也过了,求大佬调。
#include<bits/stdc++.h>
using namespace std;
int jc[20]={0,2,3,5,7,11,13,17,37,24251};
long long mul(long long a,long long b,long long mod)
{
long long ans=0;
while(b)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
long long qpow(long long a,long long b,long long mod)
{
long long ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=mul(a,a,mod);
b>>=1;
}
return ans;
}
bool MRtest(long long n)
{
if(n<3||n%2==0) return (n==2);
long long u=n-1,cnt=0;
if(u%2==0)
{
u>>=1;
cnt++;
}
for(int i=1;i<=9;i++)
{
long long v=qpow(jc[i],u,n);
if(v==0||v==n-1||v==1) continue;
for(int j=1;j<=cnt;j++)
{
v=qpow(v,2,n);
if(v==n-1&&j!=cnt) {v=1;break;}
if(v==1) return false;
}
if(v!=1) return false;
}
return true;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
if(MRtest(a))
{
cout<<"YES"<<endl;
continue;
}
cout<<"NO"<<endl;
}
return 0;
}