typ_yi @ 2024-08-25 13:34:56
#include<bits/stdc++.h>
using namespace std;
bool a[100000000];
int n,x,b[100000000];
int q,y;
int main(){
ios::sync_with_stdio(false);//没什么用的加速器
cin.tie(0);
cout.tie(0);
cin>>n;
b[1]=2;
x++;
for(int i=3;i<=n;i+=2){
if(a[i]==0){
for(int j=2;j*i<=n;j++){
a[i*j]=1;
}
b[++x]=i;
}
}
cin>>q;
while(q--){
cin>>x;
cout<<b[x]<<endl;
}
}
by Pentiment @ 2024-08-25 13:39:02
@typ_yi 你这个复杂度是
by hhztl @ 2024-08-25 13:40:32
@typ_yi 建议学习欧拉筛
by masonxiong @ 2024-08-25 13:42:52
@Pentiment 其实他这个未优化埃氏筛是
by wizard(偷开O2 @ 2024-08-25 13:46:20
o筛。
by masonxiong @ 2024-08-25 13:46:20
@typ_yi
额,优化空间很大。
首先是这两行:
for (int j = 2; j * i <= n; j++)
a[i * j] = 1;
可以改为:
for (int j = i * i; j <= n; j += i)
a[j] = 1;
以上可以优化到
然后您可以只筛到
最后您可以用效率极高的 bitset
来代替较慢的 bool []
。
by hhztl @ 2024-08-25 13:47:07
@masonxiong 我试过,bool似乎比bitset快
by masonxiong @ 2024-08-25 13:51:34
@hhztl 您开 O2 之后就不一样了,bitset
跑的是最快的,其次是 vector<bool>
,bool []
跑的最慢
by ZjfAKIOI @ 2024-08-25 13:52:20
@typ_yi 用你的代码改了改就过了
#include<bits/stdc++.h>
using namespace std;
bitset<100000001>a;
int n,x,b[100000001];
int q,y;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
b[1]=2;
x++;
for(int i=3;i<=n;i+=2){
if(a[i]==0){
for(int j=2;j*i<=n;j++){
a[i*j]=1;
}
b[++x]=i;
}
}
cin>>q;
while(q--){
cin>>x;
cout<<b[x]<<'\n';
}
return 0;
}
by ZjfAKIOI @ 2024-08-25 13:52:48
把endl换成'\n'
by typ_yi @ 2024-08-25 13:55:37
@masonxiong 谢谢已关注