SP288 PON - Prime or Not 题解
引理:
如果
证明是这样的:
根据费马小定理
考虑这样的一串数字:
最后还要求
如果以上的过程都满足了,那么
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
int T,n,A[]={2,3,5,7,11,13,17,37,325,9375,28178,450775,9780504,1795265022};
int m(int a,int b,int MOD){
int ans=0;
while(b){
if(b&1)ans=(ans+a)%MOD;
a=(a+a)%MOD;
b=b>>1;
}
return ans;
}
int pow(int a,int b,int MOD){
int ans=1;
while(b){
if(b&1)ans=m(ans,a,MOD)%MOD;
a=m(a,a,MOD)%MOD;
b=b>>1;
}
return ans;
}
bool check(int x){
if(x==2)return 1;
if(x%2==0)return 0;
for(auto C:A){
if(C>=x-1)break;
if(pow(C,x-1,x)!=1)return 0;
int a=x-1;
while(a%2==0){
a>>=1;
int u=pow(C,a,x);
if(u!=1&&u!=x-1)return 0;
if(u==x-1)break;
}
}
return 1;
}
signed main(){
scanf("%lld",&T);
while(T--){
scanf("%lld",&n);
if(check(n))printf("YES\n");
else printf("NO\n");
}
return 0;
}