Roba number(素數篩)

Roba number(素數篩)

傳送門

輸出3e74e73e7\sim 4e7的素數。由數論知識可知,每個合數的最小的大於1的因數是素數,且該素數在[2,n][2,\sqrt{n}]之間。因此我們可以用素數篩取3e74e73e7\sim 4e7的合數。

因爲4e76.324×103\sqrt{4e7}\approx6.324\times10^3.

所以我們只需要找到[1,6500][1,6500]之間的素數,然後用這些素數去篩就行了。

時間複雜度:O(m(loglog(m)+log(1e7)),m=6500O(m(loglog(m)+log(1e7)),m=6500

#include<cstdio>
#include<iostream> 
using namespace std;
typedef long long ll;
const int N=4e7+5;
#define mst(a) memset(a,0,sizeof a)
bool a[N]={0};
int x=3e7,y=4e7;
void fun(){
	int i,j;
	for(i=2;i<=6500;i++){
		 if(!a[i]){
		 	for(j=i*i;j<=6500;j+=i)
		 		a[j]=1;
		 	for(j=x/i*i;j<=y;j+=i) //x/i*i 是爲了取最接近a的且是i的倍數的數. 
		 		a[j]=1;
		 }
	}
}
int main(){
 	 fun();
	 for(int i=x;i<=y;i++){
	 	if(!a[i]) printf("%d\n",i);
	 }
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章