Pseudoprime numbers
Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (modp). That is, if we raise a to the pth power and divide byp, the remainder is a. Some (but not very many) non-prime values ofp, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for alla.)
Given 2 < p ≤ 1000000000 and 1 < a <p, determine whether or not p is a base-a pseudoprime.
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containingp 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 3 0 0
no no yes no yes yes
题意 快速幂一发的值对底数相等且幂数不为素数的输出yes
#include<stdio.h> #include<math.h> long long powMod(long long a, long long b, long long c) { long long ans = 1; a = a % c; while(b){ if(b&1) ans =(a*ans) % c; b /= 2; a = (a*a) %c; } return ans; } bool prime(long long n) { if(n == 2||n == 3) return true; if(n % 2 == 0||n % 3 == 0||n == 1) return false; long long k = sqrt(n)+1; for(long long i = 5;i < k;i += 6){ if(n % i == 0||n % (i+2) == 0) return false; } return true; } int main() { long long b, a; while(~scanf("%lld%lld",&b,&a)){ if(a==0&&b==0) break; if((powMod(a,b,b))==a&&!prime(b)) printf("yes\n"); else printf("no\n"); } return 0; }