尤拉素數篩據說它是乙個線性篩,時間複雜度接近於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)
多組輸入樣例
最大編號
1230121345
#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...