4679: 【GESP2503五级】原根判断

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:1

题目描述


输入

第一行,一个正整数 ,表示测试数据组数。
每组测试数据包含一行,两个正整数$a,p$ 。

输出

对于每组测试数据,输出一行,如果$a$ 是$p$ 的原根则输出 Yes ,否则输出 No

样例输入 复制

3
3 998244353
5 998244353
7 998244353

样例输出 复制

Yes
Yes
No

提示

#include <cstdio>

using namespace std;
int a, p;
int ans;
int fpw(int b, int e) {
    if (e == 0)
        return 1;
    int r = fpw(b, e >> 1);
    r = 1ll * r * r % p;
    if (e & 1)
        r = 1ll * r * b % p;
    return r;
}
void check(int e) {
    if (fpw(a, e) == 1)
        ans = 0;
}
int main() {
    int T;
    scanf("%d", & T);
    while (T--) {
        scanf("%d%d", & a, & p);
        ans = 1;
        int phi = p - 1, r = phi;
        for (int i = 2; i * i <= phi; i++)
            if (phi % i == 0) {
                check(phi / i);
                while (r % i == 0)
                    r /= i;
            }
        if (r > 1)
            check(phi / r);
        printf(ans ? "Yes\n" : "No\n");
    }
    return 0;
}