题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2138
米勒拉宾算法
#include <stdio.h>
_int64 pow_mod(_int64 a,_int64 b,_int64 mod)
{
_int64 ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int MillerBabbin(_int64 n,_int64 a)
{
_int64 t;
_int64 d=n-1;
if(n==2||n==a)
return 1;
if((n&1)==0)//n为偶数
return 0;
while(!(d&1))
d>>=1;
t=pow_mod(a,d,n);
while((d!=n-1)&&(t!=1)&&(t!=n-1))
{
t=t*t%n;
d<<=1;
}
return ((t==n-1)||(d&1)==1);
}
int isPrime(_int64 n)
{
int i;
_int64 test[5]={2,3,5,7};
for(i=0;i<4;++i)
{
if(!MillerBabbin(n,test[i]))
return 0;
}
return 1;
}
int main()
{
int n,ans;
_int64 x;
while(scanf("%d",&n)!=EOF)
{
ans=0;
while(n--)
{
scanf("%I64d",&x);
if(isPrime(x))
ans++;
}
printf("%d\n",ans);
}
return 0;
}