线性筛
思想:每个数有且仅筛一次
解决:每个数只被其最大因子(非本身)筛去
设合数x最小素因子为p,x=pq,易知p<=q
我们让x只被q筛去,选择枚举q
枚举q时,找到所有满足的p,筛去数x,一个不漏
void sieve() {
for(int i=2;i<=m;i++) { //枚举q
if(v[i]==0) {
ps[++cnt]=i; //统计p
}
for(int j=1;j<=cnt;j++) { //枚举满足的p
if(i*ps[j]>m) break;
v[i*ps[j]]=1;
if(i%ps[j]==0) break; //条件判断
}
}
} //统计2到m的质数
上述代码意思是:设q最小素因子为u,q=uv
1.若p<=u(p是质数),则p是x=pq的最小素因子,满足条件,筛去x
2.若p>u,x=pq=puv=u*(pv),p不是x最小素因子,这个数会被pv(大于q)筛去,重复了,可以跳出不再筛x
至此,这个算法的正确性和充分性都被证明了.
(原创)
![](https://g.csdnimg.cn/static/user-reg-year/1x/0.png)
标签:ps,pq,pv,筛去,break,因子,理解,线性 来源: https://blog.csdn.net/cqbzlydd/article/details/104119371
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。