分析:题目就是让你求给定的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; }