题意:对于一个非素数p和任意一个数a,若a^p=a(mod p),则输出yes,否则输出no。
思路:判断素数+二分幂。
题目链接:http://poj.org/problem?id=3641
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=100000; 10 11 long long p,a; 12 bool isprime[N]; 13 int prime[N]; 14 15 bool judge(long long n){ 16 long long k=sqrt(n*1.0); 17 for(int i=1;prime[i]<=k;i++) 18 if(n%prime[i]==0) return false; 19 return true; 20 } 21 22 long long quickpow(long long n,long long m,long long k){ 23 long long b=1; 24 while(m){ 25 if(m&1) b=(b*n)%k; 26 n=(n*n)%k; 27 m>>=1; 28 } 29 return b; 30 } 31 32 int main(){ 33 34 // freopen("data.in","r",stdin); 35 // freopen("data.out","w",stdout); 36 37 int cnt=0; 38 for(int i=2;i<N;i++) 39 if(!isprime[i]){ 40 prime[++cnt]=i; 41 for(int j=2;i*j<N;j++) 42 isprime[i*j]=true; 43 } 44 while(scanf("%lld%lld",&p,&a),p||a){ 45 if(judge(p)) {puts("no"); continue;} 46 long long k=quickpow(a,p,p); 47 if(k==a) puts("yes"); 48 else puts("no"); 49 } 50 return 0; 51 }