标签:lis 记录 依次 个数 math i+1 合数 log 复杂度
目录
素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
约数定义:如果存在一个整数\(k\),使得\(a=k*d\),则称\(d\)整除\(a\),记做\(d|a\),称\(a\)是\(d\)的倍数,如果\(d>0\),称\(d\)是\(a\)的约数。特别的任何数都整除\(0\)。
合数是指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
在自然数中,质数的个数并不多,对于一个足够大的整数\(N\),不超过\(N\)的质数大约有\(N/lnN\)个。(证明很复杂,自己上网找,理解不了就记下来)
任何一个大于1的正整数都能唯一分解为有限个质数的乘积。
\(N=p_1^{c_1}p_2^{c_2}p_3^{c_3}p_4^{c_4}……p_m^{c_m}\)
其中\(c_i\)都是正整数,\(p_i\)都是质数,且\(p_1<p_2<p_3……<p_m\).
由上面的定理可知\(N\)的正约数集合可写作:
{\(p_1^{b_1}p_2^{b_2}……p_2^{b_2}\)},且\(0<=b_i<=c_i\)
\(N\)的正约数个数为\((c_1+1)(c_2+1)*……*(c_m+1)=\prod_{i=1}^m(c_i+1)\)
正约数和为\(\prod_{i=1}^m(\sum_{j=0}^{c_i}(p_i)^j)\)
暴力试除:
若一个正整数\(N\)为合数,则存在一个能整除\(N\)的数\(T\),且\(2<=T<=\sqrt{N}\).
所以我们暴力扫描\(2\)~\(\sqrt{N}\)的整数,若都不能整除\(N\),\(N\)就是质数。同时要特判0和1两个数,它们既不是质数,也不是合数。
如果\(x\)为合数,那么\(x\)的倍数一定是合数。
我们可以根据上面的命题,由小到大扫描每个数\(x\),把\(2x,3x,4x……\lfloor N/x \rfloor*x\)打上标记,记为合数。当扫描到某个数后,如果没被标记,它就是合数。
这个算法的时间复杂度是\(O(\sum_{质数p<=N}N/p)=O(NloglogN)\),很接近线性,一般竞赛里都用这个方法。
我们想一下,按照埃筛的方法标记的时候,会出现重复标记的情况。
比如12,它在标记2的倍数时被标记了一次,在标记3的倍数时被标记了一次。
线性筛是通过从小到大储存质因子来标记合数。
设数组\(pf\)记录每个数的最小质因子,按照下面的步骤来操作:
这样每个合数\(i*p\),只会被最小质因数\(p\)标记一次,时间复杂度为\(O(N)\);
标签:lis 记录 依次 个数 math i+1 合数 log 复杂度
原文地址:https://www.cnblogs.com/plzplz/p/12121847.html