篩法求素數就是先認定所有的數是素數(int a[10000]=),再通過一些方法把合數踢掉(a[i']=1)
一般篩法的思想是:從2開始找,素數的倍數(1倍、2倍、3倍,,,)
為合數。它的缺點是會重複篩除一些合數 ( 像篩除3*5之後又會篩除5*3,這樣會使複雜度很大)
快速線性篩法的特點就是不會重複篩除乙個合數。它的原理是
前提是:乙個合數
i=p1*p2*...*pn, pi都是素數(2<=i<=n), pi<=pj ( i<=j )
p1是最小的係數。這樣每乙個合數就有乙個確定的表示方法,不會重複。(像12=2*2*3)
no.1:我們現在規定乙個合數由兩個數得到。
no.2:那麼合數有兩種。1.素數*素數=合數 2.乙個最小的素數*合數=合數
篩除:
如果遇到i為素數,那麼乙個大的素數 i 乘以不大於 i 的素數,這樣篩除的數跟之前的是不會重複的
如果遇到i為合數,我們只認為合數由乙個最小的素數*合數得到,也不會重複(就像12=2*6而不是12=3*4)
那麼**來了
#includeusing namespace std;
const long n = 200000;
long prime[n] = ,num_prime = 0;
int isnotprime[n] = ;
int main()
}
return 0;
}
線性篩法的應用
by qw 線性篩法最基礎的功能就是求 1,n 中的素數,以此為基礎,可以對他進行一些變形。變形後的線性 篩法可以實現許多其他的功能。下文中的tot均指一定區間內的質數個數 先看一道簡單的問題 求 1,n 中的m個數的最大質因子的序數 hdoj2136 這個問題可以利用線性篩法打乙個質數表,然後二分...
神奇的線性篩法
所謂線性篩法,顧名思義它是線性的篩素數的方法,所以是o n 的int getprime int lim 這是普通篩法 int getprime int lim 這是線性篩法 某神犇已經測過,我直接上結果 可以發現,普通篩法將每個質數的倍數都篩掉,每個合數都被篩了它的質因子次 that s too s...
乘法逆元的線性篩法
目錄位址 對於已知模數 m 求出在模 m 意義下,1 n 的逆元 n leq m 1 n 較大,只支援 o n 複雜度的演算法 一般保證 m 是質數,否則有的數不存在逆元 由遞推的方法 o n 考慮模 m 意義下 1 equiv 1 mod m 考慮求 n 的逆元,可知 m lfloor rfloo...