題目大意:
如題,給定乙個範圍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,即依次為每乙個詢問的結果。輸入...