Poj 3641 Pseudo Prime numbers [quick power], pojpseudo prime
Pseudo Prime numbers
Time Limit:1000 MS |
|
Memory Limit:65536 K |
Total Submissions:6645 |
|
Accepted:2697 |
Description
Fermat's theorem states that for any prime numberPAnd for any integerA> 1,Ap=A(ModP). That is, if we raiseAToPTh power and divideP, The remainder isA. Some (but not very values) non-prime valuesP, Known as base-APseudo primes, have this property for someA. (And some, known as Carmichael Numbers, are base-APseudo Primes for allA.)
Given 2 <P≤0, 1000000000 and 1 <A<P, Determine whether or notPIs a base-APseudo Prime.
Input
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containingPAndA.
Output
For each test case, output "yes" if p is a base-APseudo Prime; otherwise output "no ".
Sample Input
3 210 3341 2341 31105 21105 30 0
Sample Output
nonoyesnoyesyes
Give two numbers p. If p is a prime number, output no. Otherwise, judge whether the p power of a is equal to a after modulo p is obtained.
Code:
#include <stdio.h>#include <math.h>#define LL __int64int is_prime(int n){if(n < 2) return 0;for(int i = 2; i <= sqrt(n+0.0); i++){if(n%i == 0) return 0;}return 1;}int fast(int p, int a){LL r = p, t = 1, mod = p;while(r > 0){if(r&1) t = ((t%mod)*(a%mod))%mod;a = ((a%mod)*(a%mod))%mod;r >>= 1;}return t%mod;}int main(){int p, a;while(scanf("%d%d", &p, &a), p||a){if(is_prime(p)){printf("no\n"); continue;}else if(fast(p, a) == a){printf("yes\n");}else printf("no\n");}return 0;}