有关素数的基础算法
模板
1 //假设输入都是正整数 2 //素数测试O(√n) 3 bool Is_prime(int n) 4 { 5 for (int i = 2; i * i <= n; i++) 6 if (n % i == 0) return false; 7 return n != 1; //1是例外,1不是素数 8 } 9 10 //约数枚举O(√n) 11 vector<int> divisor(int n) 12 { 13 vector<int> res; 14 for (int i = 1; i * i <= n; i++) 15 { 16 if (n % i == 0) 17 { 18 res.push_back(i); 19 if (i != n / i) res.push_back(n / i); 20 } 21 } 22 return res; 23 } 24 25 //整数分解O(√n) 26 map<int, int>prime_factor(int n) 27 { 28 map<int, int>res; 29 for (int i = 2; i * i<= n; i++) 30 { 31 while (n % i == 0) 32 { 33 ++res[i]; 34 n /= i; 35 } 36 } 37 if (n != 1) res[n] = 1; //最多只有一个素因数大于√n 38 return res; 39 } 40 41 42 //返回n以内素数的个数 43 //埃氏筛法O(nloglogn) 44 const int maxn = 100000 + 10; 45 int prime[maxn]; //prime[i]表示第i个素数 46 bool is_prime[maxn + 1]; //is_prime[i]为true表示i是素数 47 48 int sieve(int n) 49 { 50 int cnt = 0; 51 for (int i = 0; i <= n; i++) is_prime[i] = true; 52 is_prime[0] = is_prime[1] = false; 53 for (int i = 2; i <= n; i++) 54 { 55 if (is_prime[i]) 56 { 57 prime[cnt++] = i; 58 for (int j = i * i; j <= n; j += i) is_prime[j] = false; //i * i可能爆int 59 } 60 } 61 return cnt; 62 } 63 64 //只要求得到素数表 65 //埃氏筛法的简单改进 66 const int maxn = 100000 + 10; 67 bool is_prime[maxn + 1]; 68 69 void sieve(int n) 70 { 71 int m = (int)sqrt(n + 0.5); 72 memset(is_prime, true, sizeof(is_prime)); 73 is_prime[0] = is_prime[1] = false; //1是特例 74 for (int i = 2; i <= m; i++) if (is_prime[i]) 75 for (int j = i * i; j <= n; j += i) is_prime[j] = false; 76 }
个性签名:时间会解决一切