数论相关
数论相关
积性函数
推论1:积性函数 \(f\) 一定满足 \(f(1) = 1\)。
推论2:通过质数点值可以唯一确定完全积性函数,因为质数可以组成所有的数;通过所有 \(p^k\) 处的点值可以唯一确定积性函数,因为积性函数有前置条件 \(n \bot m\) 所以要组合出有多个质因子 \(p\) 的数就需要 \(p^k\) 处的点值。
Dirchlet 卷积
Dirchlet 卷积有类似于乘法的性质:
-
交换律
-
结合律
-
单位元,即 $ \epsilon(n) = [n = 1]$。
-
两个积性函数的 Dirchlet 卷积依旧是积性函数。
-
积性函数的 Dirchlet 逆依旧是积性函数。
计算
Dirchlet卷积可以直接计算,复杂度就是调和级数 \(O(nlogn)\)。
Dirchlet逆依旧可以直接计算:
有函数 \(f\),需要求出 \(g\) 满足 \(f \otimes g = \epsilon\)。
那么显然就有 \(f(1)g(1) = 1\),则 \(g(1) = \frac{1}{f(1)}\)。当 \(n \geq 2\) 时,则有
常用数论函数
\(\epsilon(n) = [n = 1]\)
\(id_k(d) = d^k\)
\(\sigma_k(n) = \sum_{d|n} d^k\)
\(\mu(n)\)
\(\varphi(n)\)
性质;
\(\mu \otimes 1 = \epsilon\)
\(\varphi \otimes 1 = id\)
\(\mu \otimes id = \varphi\) (这个可以拿前两个推)
\(1 \otimes 1 = d\)
\(1 \otimes id_k = \sigma_k\)
莫比乌斯反演
证明很简单:
联系子集反演:
我们知道 \(s\) 是一个集合,而 \(d\) 可以看作是所有质因子的多重集,所以二者很相似,我们可以这样理解,如果 \(n = \prod p\),也就是所有质因子质数为1,那么就和子集反演完全等价,就可以理解 \((-1)^{|S| - |T|} = \mu(n / d)\)。
整除分块
这个很牛,考虑一个问题,我们固定一个不变 \(n\),那么所有的 \(\lfloor \frac{n}{x} \rfloor\) 有多少种取值?
答案是 \(O(\sqrt n)\) 种,证明:
\(x \leq \sqrt n\) 时,显然有 \(O(\sqrt n)\) 种,因为 \(x\) 只有 \(\sqrt n\) 个。
\(x > \sqrt n\) 时,因为 \(\lfloor \frac{n}{x} \rfloor \leq \sqrt n\) ,所以也只有 \(O(\sqrt n)\) 种。
那么 \(\lfloor \frac{n}{x} \rfloor\) 的取值就是若干个颜色段,只要我们可以 \(O(1)\) 的求出边界是多少,那么就可以 \(O(\sqrt n)\) 的算出 \(\sum \lfloor \frac{n}{x} \rfloor\)!
现在我们知道一个颜色段的左端点 \(l\),考虑设右端点为 \(r\),那么就有:
所以 \(\large r = \frac{n}{\lfloor \frac{n}{l} \rfloor}\)。
多维形式
也就是有多维,以两维为例,我需要求 \(\sum \lfloor \frac{n}{i}\rfloor \lfloor \frac{m}{i}\rfloor\),分析一下发现颜色段还是 \(O(\sqrt n)\) 级别,如果维数过大,那么就是 \(O(k \sqrt n)\) 。我们每次 \(r\) 取 \(\large min(\frac{n}{\lfloor \frac{n}{l} \rfloor}, \frac{m}{\lfloor \frac{m}{l} \rfloor})\)即可。
筛法
线性筛
筛 \(\mu\) 和 \(\varphi\)
我们就考虑线性筛时的两种情况:
-
\(i \% p \neq 0\) 时,那么对于 \(\varphi\) 就是用积性函数性质 \(\varphi(i * p) = \varphi(i) * \varphi(p) = \varphi(i) * (p - 1)\), 对于 \(\mu\) 就是多了一个不同质因子 \(\mu(i * p) = -\mu(i)\)。
-
\(i \% p = 0\)时,我们用上面 \(\varphi\) 的公式就发现 \(\varphi(i * p) = \varphi(i) * p\),对于 \(\mu(i * p)\) 就直接变成 \(0\)。
筛一般的积性函数
由前面推论2我们知道,题面肯定会给在 \(p\) 或者 \(p_k\) 的点值,这个点值的计算我们姑且声称他的时间复杂度为 \(O(logn)\)。那我们怎么用线性筛筛出所有的呢?
我们知道线性筛是用最小质因子来筛的,那么设 \(n = p_0^{k_0} \prod p_i^{k_i}\),我们钦定 \(p_0\) 为最小质因子,\(m = \prod p_i^{k_i}\),那么我们用 \(p_0\) 筛 \(n\) 的时候就可以 \(f(n) = f(m) * f(p_0^{k_0})\),我们就只需要知道最小质因子的次数,这在线性筛的过程中就可以做到,很简单。
杜教筛
杜教筛是比较基础的亚线性筛法。 可以在低于线性的复杂度筛出积性函数的前缀和。
我们现在除了化式子拆掉 \(\sum\),能加速求和的就只有整除分块了,所以我们需要构造出来跟除法有关,尝试用 Dirchlet 卷积,若我们现在要求 \(f\),所以我们需要构造一个 \(g\),通过 \(g\) 来求出 \(f\),一个方法就是卷积起来在拆开,我们尝试化一下式子。
观察到 \(\sum_{i = 1}^{n / d}f(i)\) 只有 \(O(\sqrt n)\) 个取值,\(g\) 是我们所构造的,如果我们能构造出容易计算的 \(g\) 和 \(f \otimes g\),那么就可以快速算出答案。
方便描述,我们成全体 \({S_f(\lfloor n / x \rfloor)}\) 为 \(f\) 的基本和组。
可以分析得出时间复杂度 \(O(n^{\frac{3}{4}})\),并且如果可以,可以 \(O(n)\) 筛出前 \(n^{\frac{2}{3}}\) 项,大于 \(n^{\frac{2}{3}}\) 的就递归计算。
上面的是已知 \(f \otimes g\) 的基本和组和 \(g\) 的基本和组,求 \(f\) 的基本和组。
如果我们已知 \(f\) 和 \(g\) 的基本和组,我们一样可以类似杜教筛的求 \(f \otimes g\) 的基本和组。
直接拿这个算和上面本质相同。
我们还有另外一个方法。
狄利克雷双曲线法
我们用一下简单的容斥。
注意到 \(xy \leq n\) 是一个双曲线,我们可以这样容斥,如图。
这是一个双曲线,我们把所有的 \(f(x)g(y)\) 看作点 \((x, y)\),那么蓝色部分就是 \(y \leq \sqrt n\) 的点集,红色部分就是 \(x \leq \sqrt n\) 的点集,相交部分就是同时满足两个条件的。
所以我们可以算出蓝色部分和红色部分再减去相交的部分,用式子表述就是:
这个东西复杂度没有变化,但是听说常数比较小。感觉上也更妙一些。。。
Powerful Number 筛
这个东西要暴力一些,比杜教筛更现代。 而且更快。