SDNU OJ 1522 尤拉素數篩)

2021-08-16 23:29:03 字數 1442 閱讀 7517

尤拉素數篩據說它是乙個線性篩,時間複雜度接近於o(n),可惜我不會證明。

裸的尤拉素數篩模板

bool isprime[numsize]; 

int prime[numsize];

memset(isprime, 1, sizeof(numsize));

isprime[1] = false;

int cnt = 1;

for(int i = 2; i <= numsize; i ++)

for(int j = 1; j < cnt&&prime[j]*i <= numsize; j ++)

}

1處解釋:prime陣列中的素數是遞增的,當i能整除prime[j],那麼i*prime[j+1]這個合數肯定被prime[j]乘以某個數篩掉。   因為i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那麼i*prime[j+1]=(k*prime[j])*prime   [j+1]=k』*prime[j],接下去的素數同理。所以不用篩下去了。因此,在滿足i%prime[j]==0這個條件之前以及第一次   滿足改條件時,prime[j]必定是prime[j]*i的最小因子。

該題可以說是素數篩的變形,即在篩素數的同時,記錄下最大質因子的位置。time limit: 1000 ms    memory limit: 32768 kb total submission(s): 172

accepted submission(s): 25

陸歷川很熱愛數學,最近他學了質數,他被質數深深的吸引了,但是陸歷川有個習慣,他喜歡給一些東西編號,所以他決定給所有的質數編號,例如給2編號1,3編號2,5編號3........這樣2,3,5就是質數裡面的大當家,二當家和三當家了,陸歷川現在知道了這些編號,現在他會給你乙個數,他想知道這個數的所有的質因子裡面的最大編號是多少?

注:0和1的編號都是0。

乙個自然數n(0<= n <= 1000000)

多組輸入樣例

最大編號

123

45

01213

#include #include #include #include using namespace std;

struct isprime

isprime[1000005];

int prime[1000005];

int main()

for(int j = 1; j < cnt&&i*prime[j]<1000005; j ++)}}

while(scanf("%d", &n)!=eof)

printf("%d\n", isprime[n].num);

}return 0;

}

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...

尤拉篩 素數 基礎

求乙個數是不是素數,我們最開始用到的方法是從2開始跑到這個數的前一項,如若這些數都不能被這個數整除,那麼就稱這個數是素數 素數的概念是除了1和它本身之外不再有其他因數 除了1 我們稱這樣的數為素數。如果我們就按一般思路去實現求解這個數是不是素數,那麼會用for迴圈從2開始跑到這個數的前一項,每個數都...

尤拉篩找素數

任何合數都可以表示為多個素數的乘積,合數肯定有乙個最小的質因子,通過這個最小質因子篩掉合數,保留素數。aizu0009 求小於或等於n的素數個數 n 1,999999 include include include include using namespace std const int maxa...