HDU 1905 Pseudoprime numbers

 

http://acm.hdu.edu.cn/showproblem.php?pid=1905

水题,套个米勒拉宾的模板就秒了

View Code
#include <stdio.h>

__int64 qpow(int a,int b,int r)//快速幂 

{

    __int64 ans=1,buff=a;

    while(b)

    {

        if(b&1)ans=(ans*buff)%r;

        buff=(buff*buff)%r;

        b>>=1;

    }

    return ans;

}

bool Miller_Rabbin(int n,int a)//米勒拉宾素数测试 

{

    int r=0,s=n-1,j;

    if(!(n%a))

        return false;

    while(!(s&1)){

        s>>=1;

        r++;

    }

    __int64 k=qpow(a,s,n);

    if(k==1)

        return true;

    for(j=0;j<r;j++,k=k*k%n)

        if(k==n-1)

            return true;

    return false;

}

bool IsPrime(int n)//判断是否是素数 

{

    int tab[]={2,3,5,7};

    for(int i=0;i<4;i++)

    {

        if(n==tab[i])

            return true;

        if(!Miller_Rabbin(n,tab[i]))

            return false;

    }

    return true;

}

int main()

{

    int p,a ;

    while(scanf("%d%d",&p,&a),(p||a))

    {

        if(IsPrime(p))

            puts("no") ;

        else

        {

            if(qpow(a,p,p)==a)

                puts("yes") ;

            else

                puts("no") ;    

        }

    }

    return 0 ;

}

 

你可能感兴趣的:(number)