因为对伪素数不是很了解,所以一直纠结着...
伪素数定义:(1)一定不是素数
(2)符合费马小定理 a^p==a(mod p);
题目没什么好说的...
#include<stdio.h>
#include<iostream>
using namespace std;
int jude(int n){ ///判定素数
for(int i=3;i*i<=n;i++){
if(n%i==0) return 0;
}
return 1;
}
int mult(int a1,int p){ ///二分 快速求幂
int p1=p;
__int64 b=1,a=a1;
while(p>1){
if(p%2==0){
a=a*a%p1;
p/=2;
}
else {
b=a*b%p1;
p--;
}
}
return b*a%p1;
}
int main(){
int a,p;
while(scanf("%d%d",&p,&a),a&&p){
if(jude(p)) { printf("no\n");continue;}
int flag=mult(a,p);
// cout<<flag<<endl;
if(flag==a)
printf("yes\n");
else
printf("no\n");
}
}