#include<bits/stdc++.h>
using namespace std;
int isprime[100000001],prime[100000001];
void Euler_sieve(int n){
memset(isprime,true,sizeof(isprime));
prime[0]=0; //记录当前素数个数 ;
for(int i=2;i<=n;i++){
if(isprime[i]) prime[++prime[0]]=i; //把素数保存到素数表 prime中,并更新素数个数 ;
for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=false; //筛除i*prime[j];
if(i&prime[j]==0) break; //当i中含有素因子prime[j] 时中断循环,确保每个数 只被它的最小素因子筛除
}
}
}
int a,b;
int main(){
cin>>a;
Euler_sieve(a);
//for(int i=1;i<=a;i++){ 测试
// cout<<isprime[i]<<" ";
//}
//cout<<endl;
//for(int i=1;i<=prime[0];i++){
// cout<<prime[i]<<" ";
//}
cout<<prime[0]<<endl;
return 0;
}
之前写过欧拉筛模板,懒得做这道题,结果照搬上来全MLE了……