质数
- 定义:针对所有大于一的只包含1和它本身两个约数的自然数
int primrs[N], cnt; bool st[N];
试除法
- 求质数 O(sqrt(n))
- 推荐写法: i <= n/i
- 时间复杂度为根号n
- 分解质因数 O(sqrt(n))
- 思路:从小到大尝试因数
- 根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积(即求出底数和质数的原因)
- n中只包含一个大于sqrt(n)的质因子
筛法求质数
- 埃氏朴素版 O(nlgn)
- 直接从2到n枚举
void get_primes(int n) { for(int i = 2; i <= n; i ++) if(!st[i])//设置的布尔变量代表 primes[cnt ++] = i; for(int j = i + i; j <= n; j += i) st[i] = true; }
- 直接从2到n枚举
- 埃氏优化版 O(lglgn)
- 只删除质数的倍数即可
-
void get_primes(int n) { for(int i = 2; i <= n; i ++) if(!st[i])//设置的布尔变量代表 primes[cnt ++] = i; for(int j = i + i; j <= n; j += i) st[i] = true; }
- 线性筛法
- n只会被最小质因子筛掉
void get_primes(int n) { for(int i = 2; i <= n; i ++) if(!st[i]) primes[cnt ++] = i; for(int j = 0; primes(=[j] <= n / i; j ++) { primes[j] * i = true; if(i % primes[j] == 0) break; //primes[j]一定是i的最小质因子 } }