1. 程式人生 > >數論-篩法素數

數論-篩法素數

size () emp 看到了 ack 處理 pac 質數 質因數分解

數論的根基,素數

寫在前面:之前的老板子。

首先貼一個線性篩。O(n)

#include <iostream>
#include <cstdio>
#include <vector> 
using namespace std;

const int N = 100000 + 5;
bool prime[N];
int p[N],tot;//p數組用來存質數

void init(){
    for(int i = 2; i < N; i++){
        prime[i] = true;
    }
    for(int i = 2; i < N; i++){
        if(prime[i])
            p[tot++] = i;
        for(int j = 0 ; j < tot && i*p[j] < N; j++){
            prime[i*p[j]] = false;
            if( i%p[j] == 0 )
                break;
        }   
    } 
}

是個寫爛了的模板。偶然在某個blog上看到了應用

/*篩法的應用*/ 
//預處理每個數的所有質因數
vector<int> prime_factor[N];
void init1(){
    for(int i = 2; i < N; i++){
        if(prime_factor[i].size() == 0){
            for(int j = i; j < N; j += i){
                prime_factor[j].push_back(i);
            }
        }
    }
} 

//預處理每個數的所有因數 
vector<int> factor[N]; void init2(){ for(int i = 2; i < N; i++){ for(int j = i; j < N; j += i){ factor[j].push_back(i); } } } //預處理每個數的質因數分解 vector<int> factor_prime[N]; void init3(){ int temp; for(int i = 2; i < N; i++){ if(factor_prime[i].size() == 0
){ for(int j = i; j < N; j+=i){ temp=j; while(temp % i == 0){ factor_prime[j].push_back(i); temp /= i; } } } } }

這裏就是鞏固了一下STL中vector的用法。我是記不太清了。所以剛好復習了一下。

最後貼個輸出


int main(){ 
    init1();
    for(int i=2; i < N; i++){
        for(int j=0;j<prime_factor[i].size();j++){
            cout<<prime_factor[i][j]<<" ";
        }
        cout<<endl;
    }
 
    return 0;
} 

數論-篩法素數