素数的欧拉筛

文章目录

  • 理论基础
    • 概念
    • 基础:埃式筛
    • 埃式筛的优化:欧拉筛
  • 板子题:【模板】线性筛素数
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • 板子

理论基础

概念

“质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。”
“合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。”
1既不是质数也不是合数.
在大于1的数的范围内,那么如果我们要找质数,那么只需要找到合数,然后将合数去掉,那么便只有质数.
注意,此篇文章所说因数不包括1和其本身.

基础:埃式筛

由于定义,合数可以分解为因数相乘.容易知道,这个因数必定比合数小.因此我们只要在从小到大遍历数字的时候,遍历到这个数字之前一定会经过它的质数.故如果我们在遍历每个数字的时候将它的倍数的数字都删掉,就必定会删去所有的合数,从而留下质数.当我们遍历到这个数字的时候,如果它还没有被筛过,那么这个数就是质数.这就是埃式筛.但是埃式筛对有些数字筛选次数比较多,没有必要.
接下来进行优化.

埃式筛的优化:欧拉筛

合数必定能被分解为质因数//原因:假如有一个合数,那么它必定拥有因数,如果因数有一个为合数,那么该合数一定能继续分解为两个因数相乘,直到分解到不可以再分解为止.因此合数一定可以分解为一个比他小的质数乘一个比他小的数字.即分解到一个质数和一个比他小的数字相乘,那么如果我们在遍历数字时,(从2,3,4等等)去掉这个数字之前的质数的倍数,那么必定可以在遍历到合数之前筛掉该合数.

板子题:【模板】线性筛素数

题目背景

本题已更新,从判断素数改为了查询第 k k k 小的素数
提示:如果你使用 cin 来读入,建议使用 std::ios::sync_with_stdio(0) 来加速。

题目描述

如题,给定一个范围 n n n,有 q q q 个询问,每次输出第 k k k 小的素数。

输入格式

第一行包含两个正整数 n , q n,q n,q,分别表示查询的范围和查询的个数。

接下来 q q q 行每行一个正整数 k k k,表示查询第 k k k 小的素数。

输出格式

输出 q q q 行,每行一个正整数表示答案。

样例 #1

样例输入 #1

100 5
1
2
3
4
5

样例输出 #1

2
3
5
7
11

提示

【数据范围】
对于 100 % 100\% 100% 的数据, n = 1 0 8 n = 10^8 n=108 1 ≤ q ≤ 1 0 6 1 \le q \le 10^6 1q106,保证查询的素数不大于 n n n

Data by NaCly_Fish.

板子

#include
using namespace std;
int     MAX = 10000 * 10000;
//是否被筛掉
int n, q, k;
int main(void)
{
	ios::sync_with_stdio(0);
	int maxn;
	cin >> maxn >> q;
	int prime[MAX];
	bool vis[MAX];
	for (int i = 2; i < maxn; i++)
	{
		if (vis[i] == 0)
			prime[n++] = i;//如果没有被筛掉,那么为质数
		//这步结束后,n代表现在找到的质数个数
		for (int j = 0; j < n && i * prime[j] < MAX; j++)
		{//从第一个质数到已经找到的质数开始遍历j < n 
		//i* prime[j] < MAX 因为要找的是2到MAX的质数,因此如果大于MAX没有意义,不需要划掉
			vis[i * prime[j]] = true;//划掉i与现在对应质数的乘积
			if (i % prime[j] == 0)//如果现在遍历到的数字是质数的倍数
				//如现在i等于9 prime【j】对应为3,那么跳出循环,9乘5=3*15
				//那么i=prime【j】*k;k等于1,2,3等
				// 如果循环继续,那么下一步划掉i*prime【j+1】=prime【j】*k*prime【j+1】
				// 第一个质数为2,k*prime【j+1】一定比prime【j】大,因此下一步划掉的合数一定在划掉划掉
			{
				break;
			}
		}
	}
	while (q--)
	{
		cin >> k;
		cout << prime[k-1] << endl;//输出第k个素数
	}
}

你可能感兴趣的:(算法经典问题,板子,算法)