题目大意
给定两个数p和a,判断p是否是一个伪素数。
两个条件:
①p不是一个素数;
②a^p≡a(mod p)。
附AC代码:
#include<bits/stdc++.h>
typedef unsigned long long int ll;
using namespace std;
bool isprim(ll x)
{
if(x==1)
return 0;
else if(x==2)
return 1;
for(ll i=2; i*i<=x; i++)
{
if(x%i==0)
return 0;
}
return 1;
}
ll quick_pow(ll a,ll b,ll mod)
{
ll ans=1;
while(b>0)
{
if(b%2)
ans=(ans%mod)*(a%mod);
a=(a*a)%mod;
b/=2;
}
return ans%mod;
}
int main()
{
ll p,a;
while(scanf("%llu%lld",&p,&a)&&(a*p))
{
if(isprim(p))
{
printf("no\n");
}
else
{
if(quick_pow(a,p,p)!=a)
printf("no\n");
else
printf("yes\n");
}
}
return 0;
}