POJ3641 快速幂

Pseudoprime numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8101   Accepted: 3376

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-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,如果a^p%p == a成立输出YES,不然输出NO;


#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; ll pow_mod(ll x, ll n, ll mod){ ll res = 1; while(n > 0){ if (n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } bool prime(int x){ if (x == 1)return false; for (ll i = 2; i < sqrt(x) + 1; i++){ if (x % i == 0)return false; } return true; } int main(){ ll p, a; while(scanf("%I64d%I64d", &p, &a) != EOF){ if (p == 0 && a == 0) break; ll ans; if (prime(p)){ printf("no\n"); continue; } ans = pow_mod(a, p, p); //printf("ans = %I64d\n", ans); printf(ans % p == a ? "yes\n": "no\n"); } return 0; } </cmath></algorithm></cstdio>

你可能感兴趣的:(POJ3641 快速幂)