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-apseudoprimes, 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-apseudoprime.
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.
For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".
3 2 10 3 341 2 341 3 1105 2 1105 30 0
素数判定+快速幂 (素数判定的另一种方式
#include<cstdio> #include<cmath> bool set_prime(long long a){ if(a==3||a==2) return true; if (a%2==0||a%3==0||a==1) return false; int k = sqrt(a)+1; for(int i=5;i<k;i+=6) if(a%i==0||a%(i+2)==0) return false; return true; } long long set_pow(long long a,long long b,long long c){ long long temp = 1; a = a%c; while (b){ if (b&1){ temp = temp*a%c; } a = a*a%c; b>>=1; } return temp; } int main(){ long long an,p; while (scanf("%lld %lld",&p,&an),an+p){ if (!set_prime(p) && set_pow(an,p,p) == an){ printf("yes"); } else printf("no"); printf("\n"); } return 0; }