素數篩法 模板

2022-06-12 04:12:09 字數 851 閱讀 1145

為什麼只遍歷到sqrt(n)就夠了?

反證法:

假設只遍歷2~sqrt(n)不能把所有非素數置為false,即遍歷完了2~sqrt(n)後,在sqrt(n)~n範圍內仍有乙個非素數k,但isprime[k]=true。

證: k在sqrt(k)之前一定有乙個素數因子(任何非素數都可以拆成素數的乘積,所以k至少有乙個素數因子),sqrt(k)肯定小於sqrt(n),所以sqrt(n)之前一定有乙個k的素數因子y,那麼根據**中的演算法,i=y的時候,k肯定會被置為非素數,即此時isprime[k]就會被置為false,原假設不成立。

因此只需遍歷2~sqrt(n)即可。

此方法時間複雜度為o(n*loglogn),空間複雜度為o(n)

1 #include 2 #include 3

4using

namespace

std;56

#define maxn 10000

7int prime[maxn+10]; //

儲存篩得的素數

8int primesize; //

儲存素數的個數

9bool mark[maxn+10]; //

若mark[i]為true,表示i被標記為素數

1011

void

init()12

25} 26}

27

素數篩法(模板)

質數 在大於1的整數中,如果只包含1和本身這兩個約數,那麼就是素數時間複雜度 o sqrt n static boolean prime int n return true 合數只會被它的最小質因子篩掉 時間複雜度 o n static final int n static int prime ne...

模板 素數篩法

好 快 素數是什麼就不用介紹了吧。先介紹判斷素數的方法 先看樸素演算法 for i 2 i if n i 0 break if i n printf n is prime else printf n is not prime 真的好樸素。用時o n 肯定不行啊,吃棗藥丸的。怎麼優化呢?不難發現,如果...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...