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 Source
Waterloo Local Contest, 2007.9.23
|
如果a^p%p == a,并且p是素数,输出yes,否则输出no。
#include <stdio.h>
#include <math.h>
__int64 pow(__int64 x, __int64 y, __int64 mod) {
__int64 res = 1;
while (y) {
if (y&1) res = x*res%mod;
x = x*x%mod;
y >>= 1;
}
return res;
}
bool prime(long long a) {
int i;
if(a == 2)
return true;
for(i = 2; i*i<=a; i++)
if(a%i == 0)
return false;
return true;
}
int main() {
__int64 n, p;
while (scanf("%I64d%I64d", &p, &n) != EOF) {
if (p == 0 && n == 0) break;
if (!prime(p) && n == pow(n, p, p)) {
printf("yes\n");
}
else printf("no\n");
}
return 0;
}