数论相关

数论相关

积性函数

推论1:积性函数 \(f\) 一定满足 \(f(1) = 1\)

推论2:通过质数点值可以唯一确定完全积性函数,因为质数可以组成所有的数;通过所有 \(p^k\) 处的点值可以唯一确定积性函数,因为积性函数有前置条件 \(n \bot m\) 所以要组合出有多个质因子 \(p\) 的数就需要 \(p^k\) 处的点值。

Dirchlet 卷积

\[(f \otimes g)(n) = \sum_{xy = n} f(x)f(y) \]

Dirchlet 卷积有类似于乘法的性质:

  1. 交换律

  2. 结合律

  3. 单位元,即 $ \epsilon(n) = [n = 1]$。

  4. 两个积性函数的 Dirchlet 卷积依旧是积性函数。

  5. 积性函数的 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\) 时,则有

\[(f \otimes g)(n) = \sum_{d | n} f(d)g(n / d) = 0 \\ g(n)f(1) = -\sum_{d | n, d \neq 1}f(d)g(n / d) \\ \Rightarrow g(n) = -\frac{1}{f(1)}\sum_{d | n, d \neq 1}f(d)g(n / d) \]

常用数论函数

\(\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\)

莫比乌斯反演

\[f(n) = \sum_{d|n} g(d) \Longleftrightarrow g(n) = \sum_{d|n} f(d)\mu(n / d) \]

证明很简单:

\[f = g \otimes 1 \\ g \otimes 1 \otimes \mu = g = f \otimes \mu \]

联系子集反演:

\[f_S = \sum_{T \subseteq S}g(T) \Longleftrightarrow g_S = \sum_{T \subseteq S} (-1)^{|S| - |T|}f_T \]

我们知道 \(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\),那么就有:

\[\lfloor \frac{n}{l} \rfloor \leq \frac{n}{r} \Longrightarrow r \leq \frac{n}{\lfloor \frac{n}{l} \rfloor} \]

所以 \(\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\)

\[\varphi(n) = n \prod \frac{p - 1}{p} \]

\[\mu(n) = \begin{cases} 0 \quad, 含有平方质因子 \\ (-1)^{k} \quad, 不同质因子个数 \end{cases} \]

我们就考虑线性筛时的两种情况:

  1. \(i \% p \neq 0\) 时,那么对于 \(\varphi\) 就是用积性函数性质 \(\varphi(i * p) = \varphi(i) * \varphi(p) = \varphi(i) * (p - 1)\), 对于 \(\mu\) 就是多了一个不同质因子 \(\mu(i * p) = -\mu(i)\)

  2. \(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 (f \otimes g)(i) = \sum_{i = 1}^n \sum_{d | i} g(d)f(i / d) = \sum_{d = 1}^n g(d) \sum_{d | i} f(i / d) = \sum_{d = 1}^n g(d) \sum_{i = 1}^{n / d} f(i) \\ \Rightarrow \sum_{i = 1}^n f(i) = (\sum_{i = 1}^n (f \otimes g)(i)) - \sum_{d = 2}^n g(d) \sum_{i = 1}^{n / d} f(i) \]

观察到 \(\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\) 的基本和组。

\[\sum_{i = 1}^n (f \otimes g)(i) = \sum_{i = 1}^n \sum_{d | i} g(d)f(i / d) = \sum_{d = 1}^n g(d) \sum_{d | i} f(i / d) = \sum_{d = 1}^n g(d) \sum_{i = 1}^{n / d} f(i) \]

直接拿这个算和上面本质相同。

我们还有另外一个方法。

狄利克雷双曲线法

我们用一下简单的容斥。

\[\sum_{i = 1}^n (f \otimes g)(i) = \sum_{xy \leq n} f(x)g(y) \]

注意到 \(xy \leq n\) 是一个双曲线,我们可以这样容斥,如图。

这是一个双曲线,我们把所有的 \(f(x)g(y)\) 看作点 \((x, y)\),那么蓝色部分就是 \(y \leq \sqrt n\) 的点集,红色部分就是 \(x \leq \sqrt n\) 的点集,相交部分就是同时满足两个条件的。

所以我们可以算出蓝色部分和红色部分再减去相交的部分,用式子表述就是:

\[S_{f \otimes}(n) = \sum_{x \leq \sqrt n} f(x)S_g(n / x) + \sum_{y \leq \sqrt n} g(x)S_f(n / x) - S_f(\sqrt n) S_g(\sqrt n) \]

这个东西复杂度没有变化,但是听说常数比较小。感觉上也更妙一些。。。

Powerful Number 筛

这个东西要暴力一些,比杜教筛更现代。 而且更快。

posted @ 2024-08-16 21:15  qqrj  阅读(8)  评论(1编辑  收藏  举报