HDU 2138 How many prime numbers

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

米勒拉宾素数测试,解大规模素数问题。

View Code
#include <iostream>

using namespace std ;

__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[5]={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 n;

    while(~scanf("%d",&n))

    {

        int ans=0,a;

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

        {

            scanf("%d",&a);

            if(IsPrime(a))

                ans++;

        }

        printf("%d\n",ans);

    }

    return 0;

}

 

 

你可能感兴趣的:(number)