分析:题目就是让你求给定的n个数中有多少个是素数,用一般的方法要么超时要么超内存,可以用 miller_rabin 算术来快速的判断一个数是不是素数。
# include <stdio.h>
# include <stdlib.h>
__int64 ModMul(__int64 a,__int64 b,__int64 n)
{
__int64 ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%n;
a=(a+a)%n;
b>>=1;
}
return ans;
}
__int64 ModExp(__int64 a,__int64 b,__int64 n)
{
__int64 ans=1;
while(b)
{
if(b&1)
ans=ModMul(ans,a,n);
a=ModMul(a,a,n);
b>>=1;
}
return ans;
}
bool miller_rabin(__int64 n)
{
__int64 i,j,a,x,y,t,u,s=10;
if(n==2)
return true;
if(n<2||!(n&1))
return false;
for(t=0,u=n-1;!(u&1);t++,u>>=1);
{
a=rand()%(n-2)+2;
x=ModExp(a,u,n);
for(j=0;j<t;j++)
{
y=ModMul(x,x,n);
if(y==1&&x!=1&&x!=n-1)
return false;
x=y;
}
if(x!=1)
return false;
}
return true;
}
int main()
{
__int64 i,n,a,sum;
while(scanf("%I64d",&n)!=EOF)
{
for(i=0,sum=0;i<n;i++)
{
scanf("%I64d",&a);
if(miller_rabin(a))
sum++;
}
printf("%I64d\n",sum);
}
return 0;
}