模板——线性筛素数

滑稽滑稽,这次我们来讲讲线性筛素数让我们先上代码。

#include<bits/stdc++.h>
using namespace std;
int n,line[1000005],sushu[1000005],num=0;
int main(){
    cin>>n;
    memset(line,1,sizeof(line));
    line[1]=0;
    for (int i=2; i<=n; i++){
        if (line[i]){
        	num++;
            sushu[num]=i;
		}
            for (int l=1; l<=num && i*sushu[l]<=n; l++){
                line[i*sushu[l]]=0;
                if (i%sushu[l]==0) break;//<——蓝色的语句
            }
    }
    return 0;
}

嗯,好接下来我们来看一下这个代码,意外的很短,但是理解起来还是有点难度的,但是其实重点就只是在那一条蓝色的语句上。为什么当i是sushu[l]的倍数时就break呢?

证:

∵ i%sushu[l]==0

∴ i=k*sushu[l]

∴ i*sushu[l+1]=k*sushu[l]*sushu[l+1]=k'*sushu[l]

后面的同理,证毕。

所以这样子的筛法就可以使得每一个合数都只被筛掉了一遍,效率快一点。

posted @ 2017-10-27 16:38 |斗蜂| 阅读(...) 评论(...) 编辑 收藏