首页 > 其他分享 >线性筛

线性筛

时间:2023-07-15 09:12:57浏览次数:25  
标签:prime int memset times 线性 IsPrime

引入

线性筛,通常用于筛积性函数

线性筛素数

inline void init(int n) {
	memset(IsPrime, true, sizeof(IsPrime));
	tot = 0;
	IsPrime[1] = false;
	
	for (int i = 2; i <= n; ++i) {
		if (IsPrime[i])
			prime[++tot] = i;
		
		for (int j = 1; j <= tot && i * prime[j] <= n; ++j) {
			IsPrime[i * prime[j]] = false;
			
			if (!(i % prime[j]))
				break;
			
			// i 被 prime[j] 筛过了,故 i 乘上更大的数一定被prime[j]筛过
		}
	}
}

线性筛欧拉函数

注意到在线性筛中每个合数都是被最小的质因子筛掉,分类讨论 \(i \bmod prime_j\) 的情况

  • \(i \bmod prime_j = 0\)

    此时 \(i\) 包含了 \(i \times prime_j\) 的所有质因子,则

    \[\begin{aligned} \varphi(i \times prime_j) &= i \times prime_j \times \prod \dfrac{p_k - 1}{p_k} \\ &= p_1 \times i \times \prod \dfrac{p_k - 1}{p_k} \\ &= p_1 \times \varphi(i) \end{aligned} \]

  • \(i \bmod prime_j \not = 0\)

    此时 \(i, prime_j\) 互质,故 \(\varphi(i \times prime_j) = \varphi(i) \times \varphi(prime_j)\)

inline void init(int n) {
	memset(IsPrime, true, sizeof(IsPrime));
	tot = 0;
	IsPrime[1] = false, phi[1] = 1;
	
	for (int i = 2; i <= n; ++i) {
		if (IsPrime[i])
			prime[++tot] = i, phi[i] = i - 1;
		
		for (int j = 1; j <= tot && i * prime[j] <= n; ++j) {
			IsPrime[i * prime[j]] = false;
			
			if (i % prime[j])
				phi[i * prime[j]] = phi[prime[j]] * phi[i];
			else {
				phi[i * prime[j]] = prime[j] * phi[i];
				break;
			}
		}
	}
}

线性筛莫比乌斯函数

inline void init(int n) {
	memset(IsPrime, true, sizeof(IsPrime));
	tot = 0;
	IsPrime[1] = false, mu[1] = 1;
	
	for (int i = 2; i <= n; ++i) {
		if (IsPrime[i])
			prime[++tot] = i, mu[i] = -1;
		
		for (int j = 1; j <= tot && i * prime[j] <= n; ++j) {
			IsPrime[i * prime[j]] = false;
			
			if (i % prime[j])
				mu[i * prime[j]] = -mu[i];
			else {
				mu[i * prime[j]] = 0;
				break;
			}
		}
	}
}

线性筛约数个数

\(d_i\) 表示 \(i\) 的约数个数, \(c_i\) 表示 \(i\) 的最小质因子出现次数

inline void init(int n) {
	memset(IsPrime, true, sizeof(IsPrime));
	tot = 0;
	IsPrime[1] = false, d[1] = 1;
	
	for (int i = 2; i <= n; ++i) {
		if (IsPrime[i])
			prime[++tot] = i, d[i] = 2, c[i] = 1;
		
		for (int j = 1; j <= tot && i * prime[j] <= n; ++j) {
			IsPrime[i * prime[j]] = false;
			
			if (i % prime[j]) {
				c[i * prime[j]] = 1;
				d[i * prime[j]] = d[i] * 2;
			}
			else {
				c[i * prime[j]] = c[i] + 1;
				d[i * prime[j]] = d[i] / c[i * prime[j]] * (c[i * prime[j]] + 1);
				break;
			}
		}
	}
}

线性筛约数和

\(f_i\) 表示 \(i\) 的约数和, \(g_i\) 表示 \(i\) 的最小质因子的 \(p^0 + p^1 + \cdots + p^k\)

inline void init(int n) {
	memset(IsPrime, true, sizeof(IsPrime));
	tot = 0;
	g[1] = f[1] = 1;
	
	for (int i = 2; i <= n; ++i) {
		if (IsPrime[i])
			prime[++tot] = i, g[i] = i + 1, f[i] = i + 1;
		
		for (int j = 1; j <= tot && i * prime[j] <= n; ++j) {
			IsPrime[i * prime[j]] = false;
			
			if (i % prime[j]) {
				f[i * prime[j]] = f[i] * f[prime[j]];
				g[i * prime[j]] = prime[j] + 1;
			}
			else {
				g[i * prime[j]] = g[i] * prime[j] + 1;
				f[i * prime[j]] = f[i] / g[i] * g[i * prime[j]];
				break;
			}
		}
	}
}

标签:prime,int,memset,times,线性,IsPrime
From: https://www.cnblogs.com/wshcl/p/17555529.html

相关文章

  • 数据结构之线性表
    线性表的定义和操作线性表的定义    线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为L=(a1,a2,...ai,ai+1,...an)几个概念:   相同是指每个数据元素所占空间一样大。   ai是线......
  • 线性相关性、线性表示、秩
    @目录一、线性相关性1.定义2.线性相关性的运算3.延长和缩短4.个数和维数5.整体和部分6.与线性表示的联系7.与秩、方程组、行列式的联系8.与矩阵的联系(1)\(AB=0\)(零向量)(2)左乘矩阵二、线性表示1.定义2.线性表示的运算3.整体和部分4.传递性(1)线性表示的传递性(2)向量组等价的......
  • 机器学习一 解析解方法求解线性回归_用解析法对线性回归实例求解
     机器学习一解析解方法求解线性回归_用解析法对线性回归实例求解_Starry-sky(jing)的博客-CSDN博客更正博客中一处求导公式: ......
  • R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例|附代码数据
    全文下载链接:http://tecdat.cn/?p=23050最近我们被客户要求撰写关于线性混合效应模型的研究报告,包括一些图形和统计输出。在本文中,我们将用R语言对数据进行线性混合效应模型的拟合,然后可视化你的结果线性混合效应模型是在有随机效应时使用的,随机效应发生在对随机抽样的单位进行......
  • 线性代数基础
    本文内容非常初等。基础知识来不及了,先凑活一下吧。向量向量运算解方程线性代数很大一部分在干的事就是解方程,对于一个方程组,我们可以写成\(Ax=b\)的形式。其中\(A\)是系数矩阵,\(x,b\)是向量。高斯消元线性基......
  • 【做题笔记】线性dp——线段树优化
    线段树优化是用来对于\(DP\)数组区间赋值的。主要是区间取最值来优化线性dp真没什么可写的了挂两个题目:P4644[USACO05DEC]CleaningShiftsSP1545[USACO04DEC]DividingthePathGUSACO的小清新线段树优化dp好题......
  • 双线性插值
    本文摘自:(三十六)通俗易懂理解——ROIAlign的基本原理及rpn与rcnnhead锚框标签制作-知乎(zhihu.com) ......
  • 多元线性回归预测MATLAB代码 代码注释清楚。 可以读取EXCEL数据,使用
    多元线性回归预测MATLAB代码代码注释清楚。可以读取EXCEL数据,使用换自己数据集。很方便,初学者容易上手。ID:8418656625367341......
  • 求线性代数逆序数概念是啥意思?
    想要搞明白线性代数的“逆序”问题,不需要直接看生硬的概念,直接上手做几道题,循序渐进的就明白了——简单的说,只需要看下面这三篇笔记:你知道怎么判断一组数字的逆序数吗?你会使用逆序计算这个行列式吗?利用逆序求\(n\)阶行列式的值​......
  • 线性规划对偶 & 全幺模矩阵
    一、线性规划的一般形式线性规划问题,有\(n\)个变量\(x_1,x_2,\cdots,x_n\),满足一些线性约束的条件下,求目标函数的最值。二、线性规划的标准形式设有\(n\)个变量,\(m\)个线性约束,目标函数为\(z\)。\[\maxz=\sum_{i=1}^nc_ix_i\]\[\text{s.t.}\begin{cases}......