首页 > 其他分享 >(未完工)莫反与杜教筛

(未完工)莫反与杜教筛

时间:2024-03-09 16:48:15浏览次数:12  
标签:lfloor 完工 limits dfrac sum 莫反 杜教 mu rfloor

\(p\) 是质数。\(p^k\) 是质数的幂。

广告

https://github.com/August-Light/NTFuncs

这是一个关于各种数论函数的 Python 库!

前置知识

数论函数

数论函数:定义域为正整数的函数。

  • 对于数论函数 \(f\),对于任意 \(\gcd(n,m) = 1\),如果有 \(f(nm) = f(n)f(m)\),则 \(f\) 为积性函数
    • 积性是十分美好的性质。对于积性函数,你只需要考虑 \(p^k\) 处的取值,对于其它数只需要分解质因数然后乘起来就好了。
  • 对于数论函数 \(f\),对于任意 \(n,m\),如果有 \(f(nm) = f(n)f(m)\),则 \(f\) 为完全积性函数

数论函数的运算

  • \(+\),加法:\((f + g)(x) = f(x) + g(x)\)。
  • \(-\),减法:\((f - g)(x) = f(x) - g(x)\)。
  • \(\cdot\),点积:\((f \cdot g)(x) = f(x) \times g(x)\)。
  • \(*\),狄利克雷卷积:\((f * g)(x) = \sum\limits_{d|n}f(d)g(\dfrac n d)\)。
    • 这运算看起来很奇怪。后文会详细说明这种运算的性质。

常见的数论函数

这一部分的记号好像每个人都不太一样?

  • \(\varepsilon(x) = [x = 1]\)。【完全积性函数】
  • \(1(x) = 1\)。【完全积性函数】
  • \(\text{Id}_k(x) = x^k\)。【完全积性函数】
    • 特殊地,\(\text{Id}_1\) 可以记为 \(\text{Id}\)。
  • \(\sigma_k(x) = \sum\limits_{d|x} x^k\)。【积性函数】
    • 特殊地,\(\sigma_0\) 可以记为 \(d\)。(也有人记作 \(\tau\),较少见)
    • 特殊地,\(\sigma_1\) 可以记为 \(\sigma\)。
  • \(\varphi(x)\) 为欧拉函数(A000010)。【积性函数】
    • \(\varphi(x)\) 为 \([1,x]\) 中与 \(x\) 互质的数的个数。
  • \(\mu(x)\) 为莫比乌斯函数(A008683)。【积性函数】
    • 后文会详细说明。
  • \(\lambda(x)\) 为刘维尔函数(A008836)。【完全积性函数】
    • 后文会详细说明。

狄利克雷卷积

如果一个数论函数 \(h\) 与数论函数 \(f,g\) 有以下关系:

\[h(n) = \sum\limits_{d|n}f(d)g(\dfrac n d) \]

\[h = f * g \]

狄利克雷卷积的性质

  • 交换律。
  • 结合律。
  • 有单位元 \(\varepsilon\)。
  • 每个数论函数 \(f\)(除了 \(f(1) = 0\) 的)都有逆元(即 \(f * g = \varepsilon\)):
    • \(g(n) = \dfrac 1 {f(1)} \left([n = 1] - \sum\limits_{i|n, i \ne 1} f(i)g\left(\dfrac n i \right)\right)\)
    • \(f\) 的逆元记作 \(f^{-1}\)。
  • 与加法的分配律:\((f + g) * h = f * h + g * h\)。
  • 与点积的分配律(前提:\(h\) 为完全积性函数):\((f * g) \cdot h = (f \cdot h) * (g \cdot h)\)。
  • 重要:两个积性函数的狄利克雷卷积依然是积性函数
  • 重要积性函数的狄利克雷逆元依然是积性函数

证明留作练习

\(1\) 的逆元:莫比乌斯函数

不妨起个名字叫 \(\mu\)。

\(1\) 是积性函数,所以 \(\mu\) 也是积性函数。

根据定义,不难推导得到 \(\mu(p^k) = \begin{cases} 1 & k=0 \\ -1 & k=1 \\ 0 & k>1 \end{cases}\)。

\((\mu \cdot \mu)^{-1}\) 也有个名字,叫作刘维尔函数 \(\lambda\)。

常见的狄利克雷卷积

  • \(1 * \mu = \varepsilon\)。
  • \(\varphi * 1 = \text{Id}\) 即 \(\text{Id} * \mu = \varphi\)。
    • 证明留做习题。
    • 这一条非常重要。
  • \(1 * 1 = d\) 即 \(d * \mu = 1\)。
  • \(\text{Id}_k * 1 = \sigma_k\) 即 \(\sigma_k * \mu = \text{Id}_k\)。
  • \(\lambda * (\mu \cdot \mu) = \varepsilon\)。

莫比乌斯反演

例 1:最简单的莫比乌斯反演

[POI2007] ZAP-Queries:求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^m [\gcd(i,j)=1]\)。要求 \(O(n)\)。(挑战:\(O(n^{\frac 2 3})\))

推导:不妨设 \(n \le m\)。

\[\begin{aligned} & \sum\limits_{i=1}^n \sum\limits_{j=1}^m [\gcd(i,j)=1] \\ =& \sum\limits_{i=1}^n \sum\limits_{j=1}^m \sum\limits_{d|\gcd(i,j)} \mu(d) \\ =& \sum\limits_{i=1}^n \sum\limits_{j=1}^m \sum\limits_{d=1}^n [d|i][d|j] \mu(d) \\ =& \sum\limits_{d=1}^n \mu(d) \sum\limits_{i=1}^n \sum\limits_{j=1}^m [d|i][d|j] \\ =& \sum\limits_{d=1}^n \mu(d) \left\lfloor\dfrac nd \right\rfloor \left\lfloor\dfrac md \right\rfloor \end{aligned} \]

线性筛 \(\mu\) 时间复杂度 \(O(n)\)。

杜教筛 \(\mu\) 时间复杂度 \(O(n^{\frac 2 3})\)。

例 2:难一点的莫比乌斯反演

[Luogu P2398] GCD SUM:求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^m \gcd(i,j)\)。要求 \(O(n)\)。(挑战:\(O(n^{\frac 2 3})\))

推导:不妨设 \(n \le m\)。

\[\begin{aligned} & \sum\limits_{i=1}^n \sum\limits_{j=1}^m \gcd(i,j) \\ =& \sum\limits_{d=1}^n d \sum\limits_{i=1}^n \sum\limits_{j=1}^m [\gcd(i,j) = d] \\ =& \sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} [\gcd(i,j) = 1] \\ =& \sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} \sum\limits_{t=1}^n [t|i][t|j] \mu(t) \\ =& \sum\limits_{d=1}^n d \sum\limits_{t=1}^n \mu(t) \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} [t|i][t|j] \\ =& \sum\limits_{d=1}^n d \sum\limits_{t=1}^n \mu(t) \left\lfloor \dfrac n {dt} \right\rfloor \left\lfloor \dfrac m {dt} \right\rfloor \\ =& \sum\limits_{T=1}^n \left\lfloor \dfrac n T \right\rfloor \left\lfloor \dfrac m T \right\rfloor \sum\limits_{d|T} d \mu(\dfrac T d) \\ =& \sum\limits_{T=1}^n \varphi(T) \left\lfloor \dfrac n T \right\rfloor \left\lfloor \dfrac m T \right\rfloor \\ \end{aligned} \]

解释:

  • 把 \(dt\) 用 \(T\) 代替了。
  • \(\sum\limits_{d|T} d \mu(\dfrac T d) = \varphi(T)\)。(\(\text{Id} * \mu = \varphi\))

线性筛 \(\varphi\) 时间复杂度 \(O(n)\)。

杜教筛 \(\varphi\) 时间复杂度 \(O(n^{\frac 2 3})\)。

例 3:例 2 的一般化

给定 \(A,B,C\),求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^m A_i \times B_j \times C_{\gcd(i,j)}\)。要求 \(O(n \log n)\)。(挑战:\(O(n \log \log n)\))

推导:膜拜 ZAK。

\[\begin{aligned} & \sum\limits_{i=1}^n \sum\limits_{j=1}^m A_i B_j C_{\gcd(i,j)} \\ =& \sum\limits_{d=1}^n C_d \sum\limits_{i=1}^n \sum\limits_{j=1}^m A_i B_j [\gcd(i,j) = d] \\ =& \sum\limits_{d=1}^n C_d \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} A_{id} B_{jd} [\gcd(i,j) = 1] \\ =& \sum\limits_{d=1}^n C_d \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} A_{id} B_{jd} \sum\limits_{t=1}^n [t|i][t|j] \mu(t) \\ =& \sum\limits_{d=1}^n C_d \sum\limits_{t=1}^n \mu(t) \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} \sum\limits_{j=1}^{\lfloor \frac m d \rfloor} A_{id} B_{jd} [t|i][t|j] \\ =& \sum\limits_{d=1}^n C_d \sum\limits_{t=1}^n \mu(t) \sum\limits_{i=1}^{\lfloor \frac n {dt} \rfloor} \sum\limits_{j=1}^{\lfloor \frac m {dt} \rfloor} A_{idt} B_{jdt} \\ =& \sum\limits_{T=1}^n \left(\sum\limits_{i=1}^{\lfloor \frac n T \rfloor} A_{iT}\right) \left(\sum\limits_{j=1}^{\lfloor \frac m T \rfloor} B_{jT}\right) \left(\sum\limits_{d|T} C_d \mu(\dfrac T d)\right) \\ =& \sum\limits_{T=1}^n \left(\sum\limits_{i=1}^{\lfloor \frac n T \rfloor} A_{iT}\right) \left(\sum\limits_{j=1}^{\lfloor \frac m T \rfloor} B_{jT}\right) (C * \mu)(T) \\ \end{aligned} \]

直接做是调和级数的 \(O(n \log n)\)。

狄利克雷后缀和 + 狄利克雷差分可以做到 \(O(n \log \log n)\)。

例 3.5:狄利克雷四变换

// TODO: 四变换

例 4:乘积与数论函数

[SDOI2015] 约数个数和

// TODO: 函数乘积

例 5:积性函数求和

// TODO: ZAK

杜教筛

定义 \(S_f(n) = \sum\limits_{i=1}^n f(i)\)。

基本和组(也叫块筛):对于数论函数 \(f\) 与正整数 \(n\),\(S_f\left(\left\lfloor \dfrac n i \right\rfloor\right)\) 的一系列值被称为基本和组。

  • 就是数论分块时会用到的那些值。
  • 显然 \(S_f\left(\left\lfloor \dfrac n i \right\rfloor\right)\) 的不同值只有 \(O(\sqrt n)\) 个。

杜教筛用于在低于线性的时间内求一个函数的前缀和的基本和组。

前提条件:对于要求基本和组的函数 \(f\),能够构造一个函数 \(g\),使得 \(g\) 与 \(f * g\) 的基本和组都能在 \(O(n^{\frac 2 3})\) 之内求出。

\[\begin{aligned} & \sum\limits_{i=1}^n (f * g)(i) \\ =& \sum\limits_{i=1}^n \sum\limits_{xy=i} f(x) g(y) \\ =& \sum\limits_{y=1}^n g(y) \sum\limits_{xy \le n} \\ =& \sum\limits_{y=1}^n g(y) S_f\left(\left\lfloor \dfrac n y \right\rfloor\right) \end{aligned} \]

所以:

\[S_f(n) = \dfrac 1 {g(1)} \left(S_{f*g}(n) - \sum\limits_{i=2}^n g(i) S_f\left(\left\lfloor \dfrac n i \right\rfloor\right)\right) \]

数论分块 + 记忆化。(有定理:\(\left\lfloor \dfrac {\left\lfloor \dfrac a b \right\rfloor} c \right\rfloor = \left\lfloor \dfrac a {bc} \right\rfloor\),所以确实会求出整个基本和组)

用微积分知识可得时间复杂度为 \(O(n^{\frac 3 4})\)。

预先线性筛处理 \(S_f\) 在前 \(O(n^{\frac 2 3})\) 的值,其他值用上文办法处理,可以用微积分知识证明时间复杂度 \(O(n^{\frac 2 3})\)。

关于记忆化:

  • unordered_map 最简单,并且多测的话还能重复利用,有助于卡常。
  • 也可以以 \(\lfloor \dfrac n x \rfloor\) 作为标识存储 \(S_f(x)\) 的值。不会出现重复。但是多测要记得清空。

杜教筛例题

例 1:模板

[Luogu P4213]【模板】杜教筛:求 \(S_\varphi(n)\) 与 \(S_\mu(n)\)。要求 \(O(n^{\frac 2 3})\)。

  • \(\varphi\):\(\varphi * 1 = \text{Id}\)
  • \(\mu\):\(\mu * 1 = \varepsilon\)

直接杜教筛即可。

例 2:莫比乌斯反演 + 杜教筛

[Luogu P3768] 简单的数学题:求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^n ij\gcd(i,j)\)。模数为大质数。要求 \(O(n^{\frac 2 3})\)。

由莫反例 3 可得:

\[\begin{aligned} & \sum\limits_{i=1}^n \sum\limits_{j=1}^n ij\gcd(i,j) \\ =& \sum\limits_{T=1}^n \varphi(T)T^2 \times S_{\text{Id}}(\lfloor \dfrac n T \rfloor)^2 \end{aligned}\]

问题转化为求出 \(\varphi \cdot \text{Id}_2\) 的基本和组。

《注意到》有 \((\varphi \cdot \text{Id}_2) * \text{Id}_2 = \text{Id}_3\)。

杜教筛即可。

需要注意的点

  • 常数次杜教筛嵌套,复杂度保持 \(O(n^{\frac 2 3})\)。
    • 假设你用 \(d * \mu = 1\) 来计算 \(d\) 的前缀和。
    • 首先用 \(O(n^{\frac 2 3})\) 算出 \(\mu\) 的基本和组。
    • 然后用 \(O(n^{\frac 2 3})\) 算出 \(d\) 的基本和组。
    • 总复杂度还是 \(O(n^{\frac 2 3})\)。
  • 有时 \(g\) 或 \(f * g\) 的基本和组较难计算。但是 \(f = g * h\) 这样构造出来的 \(g\) 和 \(h\) 的基本和组好算。
    • \(\sigma_k * \mu = \text{Id}_k\)。\(\mu\) 的基本和组需要一次杜教筛,麻烦。
    • 但是 \(\sigma_k = \text{Id}_k * 1\)。基本和组简单。
    • 从下文的柿子能看出,这种方法比杜教筛更加自由,只求一个前缀和的时候甚至不需要求出基本和组。
    • 推柿子:

\[\begin{aligned} & \sum\limits_{i=1}^n \sum\limits_{d|i} g(d)h(\dfrac i d) \\ =& \sum\limits_{d=1}^n g(d) \sum\limits_{i=1}^{\lfloor \frac n d \rfloor} h(i) \\ =& \sum\limits_{d=1}^n g(d) S_h\left(\left\lfloor \dfrac n d \right\rfloor\right) \end{aligned}\]

例 3:贝尔级数:系统地为积性函数构造杜教筛

[SP20173] DIVCNT2 - Counting Divisors (square):求 \(\sum\limits_{i=1}^n d(i^2)\)。要求 \(O(n^{\frac 2 3})\)。

定义一个积性函数 \(f\) 的贝尔级数为一个形式幂级数:

\[f_p(x) = \sum\limits_{i=0}^\infty f(p_i) x_i \]

对于两个积性函数 \(f,g\),\(f*g\) 的贝尔级数等于 \(f\) 与 \(g\) 的贝尔级数相乘。

常见数论函数的贝尔级数:

  • \(\varepsilon\):\(1\)
  • \(\text{Id}_k\):\(\dfrac 1 {1 - p^k x}\)
    • \(1\):\(\dfrac 1 {1 - x}\)
  • \(\mu\):\(1-x\)
  • \((\mu \cdot \mu)\):\(1+x\)
  • \(\lambda\):\(\dfrac 1 {1+x}\)
  • \(\sigma_k\):\(\dfrac 1 {(1-x)(1 - p^k x)}\)
    • \(d\):\(\dfrac 1 {(1-x)^2}\)
  • \(\varphi\):\(\dfrac {1-x} {1-px}\)

本题的函数(先平方再取 \(d\))显然是积性函数,考虑其贝尔级数:

\[f_p(x) = \dfrac {1+x} {(1-x)^2} \]

不难发现:\(f = (\mu \cdot \mu) * d\)。

Trick:\((\mu \cdot \mu)\) 的前缀和能快速求。[Luogu P4318] 完全平方数

还有吗……?

OI 中会遇到的数论题目基本到此为止了。还有一些毒瘤 [SDOI2018] 旧试题

再往后洲阁筛、Min_25 筛之类的东西我个人认为没有赛场上的实用价值。

就这样罢。

标签:lfloor,完工,limits,dfrac,sum,莫反,杜教,mu,rfloor
From: https://www.cnblogs.com/AugustLight/p/18062896

相关文章

  • 出站_完工下线
    出站_完工下线fs   1.打开子应用后光标定位到设备码文本框,扫设备码,获取资源对象resrce对象所有属性,查询条件为RESRCE属性=扫码值名称类型可为空默认/表达式GeneratedOnNull不可见存储注释IDNUMBERN AlwaysNN 流水码RESRCENVARCHAR2(255)N  NN 资源编码SITE......
  • 杜教筛——亚线性处理数论函数求和
    问题引入给定一个数论函数\(f(x)\),求\(\sum\limits_{i=1}^nf(i)\)。对\(n\le10^7\)甚至\(n\le10^8\)都是好做的,\(\mathcalO(n)\)解决即可,但如果\(n<2^{31}\)呢?这就需要亚线性时间复杂度的算法,杜教筛就是其一。杜教筛杜教筛是一种能在幂时间\(\mathcalO(......
  • 杜教筛学习笔记
    杜教筛是求一个数论函数f的前缀和,令其为S我们考虑构造一个数论函数g,根据狄利克雷卷积\[\begin{aligned}\sum_{i=1}^{n}(f*g)(i)&=\sum_{i=1}^{n}\sum_{d\midi}g(d)f\left(\frac{i}{d}\right)\\&=\sum_{i=1}^{n}g(i)S\le......
  • 红帽认证有几种?考完工资多少?
    计算机技能已经成为了当今职场的必备要求。在众多认证中,红帽认证以其高含金量和广泛的应用领域受到了众多求职者的青睐。那么,红帽认证到底有几种?考完红帽认证的工资又是多少呢?下面将为你一一解答。01红帽认证有几种?红帽认证的种类,红帽认证主要包括以下几种:RHCSA英文全称:RedHatCe......
  • 杜教筛
    (抄袭Alex_Wei)一、知识点假设我们先现在希望求出函数\(f\)在\(n\)处的前缀和\(s(n)=\sum\limits_{i=1}^nf(i)\),我们构造另一个数论函数\(g\),设\(h=f*g\),则\[\begin{aligned}&\sum\limits_{i=1}^nh(i)\\=&\sum\limits_{ij\leqn}f(i)g(j)\\=&\sum\limits_{d=1}^ng......
  • <学习笔记> 杜教筛
    杜教筛处理数论函数的前缀和问题,可以在低于线性的复杂度里求出\(S(n)=\sum_{i=1}^{n}f(i)\)。对于任意一个数论函数\(g\),必须满足:\[\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d\midi}g(d)*d(\frac{i}{d})\]\[=\sum_{d=1}^{n}g(d)\sum_{j=1}^{\lfloor\frac{n}{d}......
  • 杜教筛学习笔记
    原理前置知识:积性函数,狄利克雷卷积。杜教筛可以在亚线性的时间内算出某些函数的前缀和。假设我们要算出函数\(f\)的前缀和,我们要找到函数\(g\),记\(f*g=h\)。杜教筛的前提是\(g\)的前缀和与\(h\)的前缀和都可以快速计算,我们可以快速计算\(f\)的前缀和。首先,我们考......
  • 莫反乱做
    莫比乌斯函数重要性质\([n=1]=\sum\limits_{d|n}\mu(d)\)应用:\(\gcd(a,b)=1\Leftrightarrow\sum\limits_{d|\gcd(a,b)}\mu(d)\)P3327[SDOI2015]约数个数和首先有:\[d(ij)=\sum_{a|i}\sum_{b|j}[\gcd(a,b)=1]\]证明参考题解1,很神秘的构......
  • 杜教筛学习笔记
    积性函数定义:对于\(gcd(a,b)=1\),满足\(f(ab)=f(a)f(b)\)的函数。常用的积性函数:\(I(n)=1\)\(\epsilon(n)=[n==1]\)\(id(n)=n\)狄利克雷卷积对于两个数论函数\(f,g\),它们的狄利克雷卷积卷积是:\[(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\]单位元:\(f*\epsilon=f\)......
  • 系统集成易混淆知识点汇总-完工预算、完工估算
    概念:(1)完工预算(BAC):完工预算是在编制项目计划时确定的,完成整个项目所需的总成本。(2)完工估算(EAC):完工估算是在项目执行过程中的某个时间点,根据项目的绩效情况,所估计的完成整个项目所需的总成本。区别:(1)完工预算一经确定,通常不进行修改,如需修改,必须经过变更控制流程,由变更控制委员会......