素數

判斷素數

一個大於5的素數一定在6的倍數週圍

bool is_prime(ll n){
	if(n<2) return false;
	if(n==2 || n==3) return true;
	if(n%6!=1 || n%6!=5) return false;
	for(ll i=5;i<=n;i+=6){
		if(n%i==0 || n%(i+2)==0)
		  return false;
	}
	return true;
} 

篩素數

埃拉託斯特尼篩法(  O(nloglogn)   )

void slove(){
	memset(vis,0,sizeof(vis));
	ll cnt=0;
	for(ll i=2;i<=n;i++){
		if(!vis[i])  prime[cnt++]=i;
		for(ll j=2*i;j<=n;j+=i){
			vis[j]=1;
		}
	}
}

歐拉篩法( O(n)  )

void slove(){
	memset(vis,0,sizeof(vis));
	ll cnt=0;
	for(ll i=2;i<=n;i++){
		if(!vis[i]) prime[cnt++]=i;
		for(ll j=0;j<cnt;j++){
			if(i*prime[j]>n) break;
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章