1. 程式人生 > >3641(Pseudoprime numbers )偽素數判定(快速冪+素數判定)

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;
}