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 "); } else printf("no "); } return 0; }