滑稽滑稽,这次我们来讲讲线性筛素数,让我们先上代码。
#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]
后面的同理,证毕。
所以这样子的筛法就可以使得每一个合数都只被筛掉了一遍,效率快一点。