题目给出两个数p, a,要求根据费马小定理检验p是不是个伪素数。
用快速幂来做。
另外,不能直接将a^p == a(mod p)化成a^p-1 == 1(mod p)来做,因为转换的条件是a不是p的倍数。(贡献一wa)
#include <cstdio>
bool isprime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
long long mod_pow(long long x, long long n, long long mod) {
long long res = 1;
while (n > 0) {
if (n & 1) {
res = res * x % mod;
}
x = x * x % mod;
n >>= 1;
}
return res;
}
int main(int argc, char const *argv[]) {
int p, a;
while (scanf("%d%d", &p, &a) == 2 && p && a) {
if (!isprime(p) && mod_pow(a, p, p) == a % p) {
puts("yes");
} else {
puts("no");
}
}
return 0;
}