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
题解:大概意思就是 若p为素数,就输出no;若p不为素数,再判断a^p%p的值,若等于a,输出yes,否则输出no
编程语言:G++ #include<cstdio> #include<math.h> __int64 qpow(__int64 x,__int64 y,__int64 z) { __int64 base=x,ans=1; while(y) { if(y&1) { ans=ans*base%z; } base=base*base%z; y>>=1; } return ans; } bool f(__int64 n)/// 判断素数的函数 素数返回值为1 否则返回0 { if(n<=1) return 0; for(__int64 i=2;i<=(__int64)sqrt(n+1);i++) { if(n%i==0) return 0; } return 1; } int main() { __int64 a,p; while(scanf("%I64d %I64d",&p,&a)&&(p||a)) { if(f(p)) printf("no\n"); else { if( qpow(a,p,p)==a ) printf("yes\n"); else printf("no\n"); } } return 0; }