测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A28390. 原根判断

填空题 困难

题目描述

原根判断

题目描述

小 A 知道,对于质数p而言,p的原根g是满足以下条件的正整数:

  • 1<g<p;
  • gp-1mod p=1;
  • 对于任意1≤i<p-1均有gp-1mod p≠1 。

其中a mod p表示a除以p的余数。

小 A 现在有一个整数a,请你帮他判断a是不是p的原根。

输入格式

第一行,一个正整数T,表示测试数据组数。

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

输出格式

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

样例

输入样例 1

3
3 998244353
5 998244353
7 998244353

输出样例 1

Yes
Yes
No

数据范围

对于40% 的测试点,保证3≤p≤103 。

对于所有测试点,保证1≤T≤20 ,3≤p≤109 ,1<a<p ,p为质数。

参考答案

#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; }
上一题 下一题