數論-篩法素數
阿新 • • 發佈:2018-04-13
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;
}
數論-篩法素數