题目大意:给两个数 p 和 a , 判断 p 是不是基于 a 伪素数。即a^(p-1) ≡ 1 (mod p).
伪素数:如果n是一个正整数且是非素数,如果存在和n互素的正整数a满足 a^(n-1) ≡ 1(mod n),我们说n是基于a的伪素数。如果一个数是伪素数,那么它几乎肯定是素数。
所以 , 首先判断p是不是素数 , 然后用快速幂取模求出(a^p)%a的值是否等于a。
代码
/* 先判断 p 是否是素数
* 然后用幂取模判断(a^p) % p == a
*/
#include <iostream>
#include <cmath>
using namespace std;
bool isprim(int p)
{
int m = (double)sqrt((double)p) + 0.5;
for(int i = 2; i <= m; i++) if(p % i == 0) return true;
return false;
}
int pow_mod(int a , int n , int m) //分治法快速幂取模
{
if(n == 0) return 1;
int x = pow_mod(a , n >> 1 , m);
long long rel = (long long)x * x % m;
if(n & 1) rel = rel * a % m;
return (int)rel;
}
int main()
{
int p , a;
while(cin >> p >> a && p)
{
if(!isprim(p)) cout << "no" << endl;
else {
if(a == pow_mod(a , p , p)) cout << "yes" << endl;
else cout << "no" << endl;
}
}
return 0;
}