POJ - 3641(Pseudoprime numbers )伪素数判定(快速幂+素数判定)

题目大意

给定两个数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;
}

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/82898946