关于素数,有埃氏筛法O(nloglogn),不过有更优的线性筛法,此线性筛法还可用于筛欧拉函数与莫比乌斯函数,作用很大
1 int cnt; 2 int prime[MAXN]; 3 int pri[MAXN]; 4 int phi[MAXN]; 5 int miu[MAXN]; 6 7 /* 素数筛 */ 8 void pre_prime(){ 9 mem(prime,0); 10 cnt = 0; 11 prime[0] = prime[1] = 1; 12 for(int i = 2 ; i < MAXN ; i++){ 13 if(!prime[i]) pri[cnt++] = i; 14 for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ 15 prime[i * pri[j]] = 1; 16 if(i % pri[j] == 0) break; 17 } 18 } 19 } 20 /* 莫比乌斯筛 */ 21 void pre_miu(){ 22 mem(prime,0); 23 cnt = 0; 24 miu[1] = 1; 25 for(int i = 2 ; i < MAXN ; i++){ 26 if(!prime[i]){ 27 miu[i] = -1; 28 pri[cnt++] = i; 29 } 30 for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ 31 prime[i * pri[j]] = 1; 32 if(i % pri[j] == 0){ 33 miu[i * pri[j]] = 0; 34 break; 35 }else miu[i * pri[j]] = -miu[i]; 36 } 37 } 38 } 39 /* 欧拉筛 */ 40 void pre_phi(){ 41 mem(prime,0); 42 cnt = 0; 43 phi[1] = 1; 44 for(int i = 2 ; i < MAXN ; i++){ 45 if(!prime[i]){ 46 miu[i] = -1; 47 pri[cnt++] = i; 48 } 49 for(int j = 0 ; j < cnt && i * pri[j] <= MAXN ; j++){ 50 prime[i * pri[j]] = 1; 51 if(i % pri[j] == 0){ 52 phi[i * pri[j]] = phi[i] * pri[j]; 53 break; 54 }else phi[i * pri[j]] = phi[i] * (pri[j] - 1); 55 } 56 } 57 }
时间: 2024-10-13 05:46:45