看到这么大的数据量,首先想到线性筛(欧拉筛)
但是线性筛需要开长度为 n 的 long long 数组,显然开不下......
于是,退而求其次选择厄拉多塞筛法
bool 数组用 bitset 代替,因为一个 bool 占 1byte=8bit
而 bitset 的一位只占 1bit (用法上几乎无区别)
采用文件输出:
freopen("result.txt","w",stdout);
将结果全部输入到 result.txt 文件当中(位置就是在程序所在文件夹中)
再加上快速输出和O3优化以提高程序运行效率
基本上5分钟就可以跑出来啦~~
Code
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Max=(1ll<<32),sqrtMax=(1ll<<16);
bitset<Max+10> vis;
inline void write(ll x){ //快速输出
if(x<0){
x=~x+1;
putchar('-');
}
if(x>9)write(x/10);
putchar(x%10+'0');
}
void Prime(){
for(ll i=2;i<=Max;++i){
if(!vis[i]){//说明是素数
write(i);putchar('\n');
if(i>sqrtMax)continue;
for(ll j=i*i;j<=Max;j+=i)vis[j]=1;
}
}
}
int main(){
freopen("result.txt","w",stdout);
Prime();
return 0;
}
运行结果
由于最后的得到的文件过大,直接点是打不开的
必须使用一些专业的软件才能打开,这里贴上一个 010Editor 的安装包
https://wwu.lanzouy.com/idvNr0br5p1a
密码:4weh
安装好后,打开010Editor,然后将result.txt 拖进去即可打开