https://vjudge.net/problem/Hdu-2138
题目大意:多组数据,每组数据给
n
n
n个数,输出其中素数的个数。
思路:拉宾米勒素性测试。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};
ll fmul(ll a,ll b,ll p)
{
return (a*b-(ll)((long double)a*b/p)*p+p)%p;
}
ll qpow(ll a,ll b,ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=fmul(ans,a,p);
a=fmul(a,a,p);
b>>=1;
}
return ans;
}
bool Miller_Rabin(ll x)
{
int s=0;
ll t=x-1;
if(x==2)
return 1;
if(x<2||!(x&1))
return 0;
while(!(t&1))
{
s++;
t>>=1;
}
for(int i=0;i<12&&prime[i]<x;++i)
{
ll a=prime[i];
ll b=qpow(a,t,x);
for(int j=1;j<=s;++j)
{
ll k=fmul(b,b,x);
if(k==1&&b!=1&&b!=x-1)
return 0;
b=k;
}
if(b!=1)
return 0;
}
return 1;
}
int main()
{
ll x;
int n;
while(~scanf("%d",&n))
{
int ans=0;
while(n--)
{
scanf("%lld",&x);
ans+=Miller_Rabin(x);
}
printf("%d\n",ans);
}
return 0;
}