1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| int count_primes(int n){ const int S=1e4; int ret=0; vector<int> primes; int nsqrt=sqrt(n); vector<bool> isprime(n+1,true); for(int i=2;i<=nsqrt;++i){ if(isprime[i]){ primes.push_back(i); for(int j=i*i;j<=n;j+=i){ isprime[j]=false; } } } vector<bool> block(S); for(int k=0;k*S<=n;++k){ block=vector<bool>(S,true); int start=k*S; for(int p:primes){ int start_idx=(start+p-1)/p; int j=max(start_idx,p)*p-start; for(;j<S;j+=p){ block[j]=false; } } if(k==0)block[0]=block[1]=false; for(int i=0;i<S&&start+i<=n;++i){ if(block[i])ret++; } } return ret; }
|