埃拉托斯特尼筛法
简称埃氏筛。对于一个大于 $1$ 的正整数,它的 $x$ 倍就是一个合数。当我们从小到大编历时,就可以将当前遍历的数的倍数都打上标记不可访问,到运行结束后没有被标记的就是质数了。
考虑优化,只需要枚举到 $sqrt{n}$ 即可。这样时间复杂度是 $O(n log log n)$。
vector <int> prime;
bool is_prime[maxn];void iss (int n) {is_prime[0] = is_prime[1] = false;for (int i = 2; i <= n; i++) is_prime[i] = true;for (int i = 2; i * i <= n; i++) {if (is_prime[i])for (int j = i * i; j <= n; j += i) is_prime[j] = false;}for (int i = 2; i <= n; i++) if (is_prime[i]) prime.push_back(i);
}