二逼的素數篩選法
2b的篩選法,不多說。
const int N=1000000;bool pr[N];int p[N],lp;bool isprime(int x){ for(int i=2;i*i<=x;i++) if(x%i==0) return 0; return 1;}void initp(){ for(int i=2;i<N;i++) if(isprime(i)){ pr[i]=1; p[lp++]=i; }}
普通的素數篩選法
用到了素數篩選的思想,但是很明顯一些數被重複篩選。
普通篩選法1
const int N=100000;bool pr[N];int p[N],lp;void initp(){ for(int i=2;i<N;i++) {if(!pr[i]){ p[lp++]=i; for(int j=i+i;j<N;j+=i) pr[j]=1; } }}
普通篩選法2
const int N=100000;bool pr[N];int p[N],lp;void initp(){for(int i=4;i<N;i+=2)pr[i]=1; for(i=2;i<N;i++) if(!pr[i]){ p[lp++]=i; if(N/i>=i) for(int j=i*i;j<N;j+=i*2) pr[j]=1; }}
普通篩選法3
void calprime(){ long long i,j; memset(vis,0,sizeof(vis)); priLen = 0; for(i = 2; i <= M; i++) if(!vis[i]){ prime[priLen++] = i; for(j = i*i; j <=M; j+=i) vis[j] = 1; }}
文藝的素數篩選法
保證了每個數只被篩選一次,且是被最小質因數篩選,時間複雜度達 到o(n)。
const int N=1000000;int pr[N],p[N/10],lp;void gp(){ for(int i=2;i<N;i++) { if(!pr[i])p[lp++]=pr[i]=i; for(int j=0;j<lp && i*p[j]<N;j++){ pr[i*p[j]]=p[j]; if(i%p[j]==0)break; } }}