洛谷-P3383 【模板】線性篩素數
阿新 • • 發佈:2020-12-30
洛谷-P3383 【模板】線性篩素數
題目背景
本題已更新,從判斷素數改為了查詢第 \(k\) 小的素數
提示:如果你使用 cin
來讀入,建議使用 std::ios::sync_with_stdio(0)
來加速。
題目描述
如題,給定一個範圍 \(n\),有 \(q\) 個詢問,每次輸出第 \(k\) 小的素數。
輸入格式
第一行包含兩個正整數 \(n,q\),分別表示查詢的範圍和查詢的個數。
接下來 \(q\) 行每行一個正整數 \(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; }