POJ Pseudoprime numbers
Description
Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)
Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.
Input
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.
Output
For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".
Sample Input
3 2 10 3 341 2 341 3 1105 2 1105 3 0 0
Sample Output
no no yes no yes yes
View Code
1 #include<stdio.h> 2 int f[35000],prime[5000],count = 0 ; 3 typedef __int64 LL ; 4 void getPrime(){ 5 for(int i=2;i<=34000;i++) 6 if(!f[i]){ 7 prime[count++] = i; 8 for(int j=i*i;j<=34000;j+=i) 9 f[j] = 1; 10 } 11 } 12 bool Isprime(int n){ 13 for(int i=0;i<count && prime[i]*prime[i]<=n;i++) 14 if(n%prime[i] == 0) return 0; 15 return 1; 16 } 17 bool func(LL p,LL a){ 18 LL temp = a,mod = p; 19 LL ans = 1; 20 while(p){ 21 if(p % 2) ans = (ans * temp) % mod ; 22 p /= 2; 23 temp = (temp * temp) % mod ; 24 } 25 if(ans == a) return 1; 26 return 0; 27 } 28 int main(){ 29 getPrime(); 30 int p,a; 31 while(scanf("%d%d",&p,&a)){ 32 if(p == 0 && a== 0) break; 33 if(Isprime(p)) 34 printf("no\n"); 35 else { 36 if(func(p,a)) 37 printf("yes\n"); 38 else 39 printf("no\n") ; 40 } 41 } 42 return 0; 43 }