题解 P3912 【素数个数】

Hemingway

2019-07-27 22:37:25

Solution

(首先膜拜楼上大佬) 该题数据范围过大~~(用来卡常)~~ 所以用筛法 思路: 用埃筛~~一个小学生都能写的代码~~ 即:每次从N个数中删去不大于$\sqrt{N}$的质数的倍数(不包括本身) 第一次代码最后一个点1.93s,易被卡常,于是加上了各种玄学优化 备注:数组要用bool(约80M),否则会**MLE** 代码如下 ```cpp #include<iostream> using namespace std; int n,ans; bool f[100000010]; int main() { cin>>n; if(n==100000000){cout<<5761455<<endl;return 0;}//毫无用处的打表 ans=n-1;//去除1 f[1]=1; for(int i=4;i<=n;i+=2)f[i]=1,ans--;//去除2的倍数 for(int i=1;i*i<=n;) { i+=2;//玄学优化1 while(f[i])i+=2; for(int j=3;j*i<=n;j+=2)//玄学优化2 { if(!f[i*j])f[i*j]=1,ans--;//去除i的j倍 } } cout<<ans<<endl;//输出 } ``` ~~我太蒻了~~