洛谷 P3383 模板 線性篩素數

2021-08-08 08:31:45 字數 1241 閱讀 4290

題目大意:

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問(每個數字均在範圍1-n內)

時空限制:500ms 128m

資料規模:

對於30%的資料:

n<=10000,m<=10000

對於100%的資料:

n<=10000000,m<=100000

題解:

數學方法:

線性篩素數:

很多人都是找到乙個素數,然後翻倍法,這種方法,通常的時間複雜度為:o(n log n)

不夠高效,所以我們要優化!

即線性的去篩:

①乙個陣列表示i是否是素數,然後存乙個素數表。

②每次將乙個不是素數的i,*素數表數的數篩掉,因為

合數*素數=合數!這樣i就被[1,i]內的素數給排掉了;

③對於乙個列舉到的i,因為沒被篩掉,則為素數,繼續加入素數表。

這樣的篩法,特別的高效,因為時間複雜度取決於素數的數量!

而數到後面素數也越來越少,所以素數表的列舉並不會花費太多的時間,注意素數表不能開太小!

時間複雜度:(nm) m極小,近乎o(n)

而這道題,就是個模版,大家可以去做一下,注意判斷越界以及陣列大小即可!

var

a:array [0..1000001] of longint;

b:array [0..10000001] of boolean;

i,j,n,m:longint;

begin

readln(n,m);

b[1]:=true;

for i:=2

to n do

begin

ifnot(b[i]) then

begin

inc(a[0]);

a[a[0]]:=i;

end;

for j:=1

to a[0] do

begin

if i*a[j]>n then

break;

b[i*a[j]]:=true;

end;

end;

for i:=1

to m do

begin

readln(j);

ifnot(b[j])

then writeln('yes')

else writeln('no');

end;

end.

洛谷 P3383 模板 線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。1 ...

P3383 模板 線性篩素數 洛谷

題目描述 如題,給定乙個範圍 n,有 q 個詢問,每次輸出第 k 小的素數。輸入格式 第一行包含兩個正整數 n,q,分別表示查詢的範圍和查詢的個數。接下來 q 行每行乙個正整數 k,表示查詢第 k 小的素數。輸出格式 輸出 q 行,每行乙個正整數表示答案。輸入輸出樣例 輸入 1 複製 100 512...

洛谷 P3383 模板 線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問概數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。輸入...