线性筛素数

Luogu P3383线性筛素数

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 100000010
using namespace std;
template<typename T>
inline void read(T &x){
    x=0; bool flag=0; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
    for(;isdigit(c);c=getchar()) x=x*10+(c^48);
    if(flag) x=-x;
}

int n,q,k;
int cnt,isprime[maxn];
bool notprime[maxn];

void shai(int n){
    for(int i=2;i<=n;i++){
        if(notprime[i]==0) isprime[++cnt]=i;
        for(int j=1,t;(j<=cnt)&&((t=i*isprime[j])<=n);j++){
            notprime[t]=true;
            if(i==isprime[j]) break;
        }
    }
}

int main(){
    read(n),read(q);
    shai(n);
    for(int i=1;i<=q;i++){
        read(k);
        printf("%d
",isprime[k]);
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/DReamLion/p/14492407.html