参考程序:
#include <cstdio>
using namespace std;
int a, p;
int ans;
// 快速幂计算 (b^e) % p
int fpw(int b, int e) {
if (e == 0) return 1; // 任何数的0次幂为1
int r = fpw(b, e >> 1); // 递归计算 b^(e/2)
r = 1ll * r * r % p; // 平方取模
if (e & 1) r = 1ll * r * b % p; // 如果 e 是奇数,再乘一次 b
return r;
}
// 检查 a^(p-1)/i 是否等于 1
void check(int e) {
if (fpw(a, e) == 1) ans = 0; // 如果取模结果是 1,说明 a 不是原根
}
int main() {
int T;
scanf("%d", &T); // 读取测试数据的组数
while (T--) {
scanf("%d%d", &a, &p); // 读取 a 和 p
ans = 1; // 先假设 a 是原根
int phi = p - 1, r = phi; // 计算 p-1
// 找到 p-1 的所有质因子
for (int i = 2; i * i <= phi; i++) {
if (phi % i == 0) { // 说明 i 是 phi 的因子
check(phi / i); // 检查 a^(p-1)/i 是否等于 1
while (r % i == 0) r /= i; // 去掉 i 的所有倍数,避免重复计算
}
}
// 处理最后一个大于 sqrt(phi) 的因子
if (r > 1) check(phi / r);
// 输出结果
printf(ans ? "Yes\n" : "No\n");
}
return 0;
}