通過已知素數及當前自然數篩掉後面的合數。
同時讓每乙個合數只被篩去一次,摒棄重複的篩除操作。
兩個陣列:乙個vis, 乙個prime。
迴圈從2開始, 直到所給的上限n處(或者直接maxn)。
無論當前數是否是質數, 都要進行後續合數的處理!
篩除時要利用已有的素數。
素數規模:趨近於xln
x\displaystyle \frac
lnxx
處理出1e8
1e81e
8以內的素數用時1s1s
1s左右,實測複雜度為o(n
)o(n)
o(n)
帶乙個小常數。
1 e7
1e71e
7以內則0.1
s0.1s
0.1s
左右。
const int maxn = 1e7+7;
const int maxp = 7e5+7;
bool vis[maxn];
int prime[maxp], tot;
void getprime()
mu[i*prime[j]]=-mu[i];}}
}
尤拉篩(線性篩)求莫比烏斯函式
篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後 如果沒學過可以去學一下再看 我們發現它似乎做了很多多餘的操作,乙個數會被他的質所有篩 一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法去優化它呢?尤拉篩隨之而出,尤拉篩的特點便是乙個數隻會被它的最小質因子篩一遍,其它...
線性篩素數 尤拉函式 莫比烏斯函式
常用的兩種素數篩法見部落格 http 這裡詳講線性篩,演算法複雜度o n 這個演算法的核心思想是 每乙個合數可以被唯一地表示成它的乙個最小質因子和另外乙個數的乘積。證明略。先上 const int n 1000000 int phi n prime n mu n bool vis n void in...
線性篩素數 尤拉函式 莫比烏斯函式
判斷素數 對於n,分別列舉1 sqrt n 最樸素的素數篩 埃拉託斯特尼篩法 sieve of eratosthenes 1 int primes maxn ent 0 2 bool isprime maxn 3void getprime 414 15 複雜度 nlglgn 尤拉篩 每個合數只會被乙...