1. 程式人生 > 實用技巧 >洛谷-P3383 【模板】線性篩素數

洛谷-P3383 【模板】線性篩素數

洛谷-P3383 【模板】線性篩素數

原題連結:https://www.luogu.com.cn/problem/P3383


題目背景

本題已更新,從判斷素數改為了查詢第 \(k\) 小的素數
提示:如果你使用 cin 來讀入,建議使用 std::ios::sync_with_stdio(0) 來加速。

題目描述

如題,給定一個範圍 \(n\),有 \(q\) 個詢問,每次輸出第 \(k\) 小的素數。

輸入格式

第一行包含兩個正整數 \(n,q\),分別表示查詢的範圍和查詢的個數。

接下來 \(q\) 行每行一個正整數 \(k\)

,表示查詢第 \(k\) 小的素數。

輸出格式

輸出 \(q\) 行,每行一個正整數表示答案。

輸入輸出樣例

輸入 #1

100 5
1
2
3
4
5

輸出 #1

2
3
5
7
11

說明/提示

【資料範圍】
對於 \(100\%\) 的資料,\(n = 10^8\)\(1 \le q \le 10^6\),保證查詢的素數不大於 \(n\)

Data by NaCly_Fish.

C++程式碼

#include <cstdio>
using namespace std;

int a[100000005], c[100000005];

int main() {
    int n, q, k=1;
    scanf("%d%d", &n, &q);
    int b[q];
    for (int i=0; i<q; ++i)
        scanf("%d", &b[i]);
    c[1] = 1;
    for (int i=2; i<=n; ++i) {
        if (c[i] == 0)
            a[k++] = i;
        for (int j=1; j<k && i*a[j]<=n; ++j) {
            c[i*a[j]] = 1;
            if (i % a[j] == 0)
                break;
        }
    }
    for (int i=0; i<q; ++i)
        printf("%d\n", a[b[i]]);
    return 0;
}