这个其实可以当做求素数的模板。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define false 0
#define true 1
#define bool int
typedef unsigned long long int llong;
llong mod_pro(llong x,llong y,llong n)
{
llong ret=0,tmp=x%n;
while(y)
{
if(y&0x1)if((ret+=tmp)>n)ret-=n;
if((tmp<<=1)>n)tmp-=n;
y>>=1;
}
return ret;
}
llong mod(llong a,llong b,llong c)
{
llong ret=1;
while(b)
{
if(b&0x1)ret=mod_pro(ret,a,c);
a=mod_pro(a,a,c);
b>>=1;
}
return ret;
}
llong ran()
{
llong ret=rand();
return ret*rand();
}
bool is_prime(llong n,int t)
{
if(n<2)return false;
if(n==2)return true;
if(!(n&0x1))return false;
llong k=0,m,a,i;
for(m=n-1; !(m&1); m>>=1,k++);
while(t--)
{
a=mod(ran()%(n-2)+2,m,n);
if(a!=1)
{
for(i=0; i<k&&a!=n-1; i++)
a=mod_pro(a,a,n);
if(i>=k)return false;
}
}
return true;
}
int main()
{
llong a,b,i,cnt=0,t;
while(scanf("%lld",&t)!=EOF)
{
cnt=0;
while(t--)
{
scanf("%lld",&a);
if(is_prime(a,4))
cnt++;
}
printf("%lld",cnt);
}
return 0;
}