大佬有啥好方法,超时3个

P3383 【模板】线性筛素数

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 你这个复杂度是 \mathcal O(n\log\log n) 的,过不了


by hhztl @ 2024-08-25 13:40:32

@typ_yi 建议学习欧拉筛


by masonxiong @ 2024-08-25 13:42:52

@Pentiment 其实他这个未优化埃氏筛是 O(n\log n) 的()


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;

以上可以优化到 O(n\log\log n)

然后您可以只筛到 \sqrt n,并且可以分块筛(如果您会)。

最后您可以用效率极高的 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 谢谢已关注


| 下一页