Pseudoprime numbers
题目链接
题目大意
这一题就是关于伪素数的判别,如果有一个数p满足
ap≡a(mod p) (a<p)
且p不是素数,则我们称p为伪素数。
题解
按照题目意思快速幂求得 ap mod p 的值,最后与a相比较就行了。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define LL long long
using namespace std;
LL p,a;
LL pow_mod(LL a,LL b,LL mod)
{
LL ans=1;
while (b)
{
if (b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
bool prime(LL x)
{
bool f=1;
for (int i=2;i<=sqrt(x);i++)
if (x%i==0)
{
f=0;
break;
}
return f;
}
int main()
{
while(scanf("%I64d%I64d",&p,&a),p!=0 || a!=0)
{
if (prime(p))
{
printf("no\n");
continue;
}
LL ans=pow_mod(a,p,p);
if (ans==a) printf("yes\n");
else printf("no\n");
}
return 0;
}