杜教筛 学习笔记

Published on

清晰版

前言

好久没更了,刚考完省选有点颓。

前置知识

概述

杜教筛用于在 $\Theta\left(n^\frac32\right)$ 的时间内求解某些函数的前缀和。

公式

杜教筛的核心公式如下:
设 $f\left(i\right)$ 为目标函数(即我们要求前缀和的函数)
设 $g\left(i\right)$ 为我们构造的一个函数。

$$g\left(1\right) \sum\limits_{i = 1}^nf\left(i\right) = \sum\limits_{i = 1}^n\left(f * g\right)\left(i\right) - \sum\limits_{i = 2}^ng\left(i\right)\sum\limits_{j = 1}^{\left\lfloor\frac nj\right\rfloor}f\left(j\right)$$

其中 $\left(f * g\right)\left(i\right)$ 为 $f\left(i\right)$ 与 $g\left(i\right)$ 的狄利克雷卷积。

如果能找到一个合适的积性函数 $g\left(x\right)$,能快速求出 $\sum\limits_{i = 1}^n\left(f * g\right)\left(i\right)$ 和 $\sum\limits_{i = l}^rg\left(i\right)$,那么就能使用数论分块递归求解了。

$f\left(i\right)$ 不一定要是积性函数。

证明

$$ g\left(1\right) \sum\limits_{i = 1}^nf\left(i\right) = \sum\limits_{i = 1}^ng\left(i\right) \sum\limits_{j = 1}^{\left\lfloor\frac ni\right\rfloor}f\left(j\right) - \sum\limits_{i = 2}^ng\left(i\right) \sum\limits_{j = 1}^{\left\lfloor\frac ni\right\rfloor}f\left(j\right) $$


$$ \begin{aligned} & \sum\limits_{d = 1}^ng\left(d\right)\sum\limits_{i = 1}^{\left\lfloor\frac nd\right\rfloor} f\left(i\right) \\ = & \sum\limits_{i = 1}^n \sum\limits_{d \mid i} f\left(d\right) g\left(\frac id\right) \\ = & \sum\limits_{i = 1}^n\left(f * g\right)\left(i\right) \end{aligned} $$

复杂度

假设算 $\sum\limits_{i = 1}^x\left(f * g\right)\left(i\right)$ 的复杂度为 $H\left(x\right)$,算 $\sum\limits_{i = 1}^xg\left(i\right)$ 的复杂度为 $G\left(x\right)$:

$$T\left(n\right) = H\left(n\right) + \sum\limits_{i = 2}^{\sqrt n} G\left(i\right) + \sum\limits_{i = 2}^{\sqrt n} T\left(\left\lfloor\frac ni\right\rfloor\right)$$

通常情况下 $H\left(N\right)$ 和 $G\left(N\right)$ 都为 $\Theta\left(1\right)$。

$$T\left(n\right) = \Theta\left(\sqrt n\right) + \sum\limits_{i = 2}^{\sqrt n} T\left(\left\lfloor\frac ni\right\rfloor\right)$$


$$T\left(\left\lfloor \frac nj\right\rfloor\right) = \mathcal O\left(\sqrt \frac nj\right) + \sum\limits_{i = 2}^{\mathcal O\left(\sqrt \frac nj\right)} T\left(\left\lfloor\frac n{ij}\right\rfloor\right)$$

后面的那个可以忽略,于是

$$T\left(\left\lfloor \frac nj\right\rfloor\right) = \mathcal O\left(\sqrt \frac nj\right)$$


$$ \begin{aligned} T\left(n\right) &= \Theta\left(\sqrt n\right) + \sum\limits_{i = 2}^{\sqrt n} T\left(\left\lfloor\frac ni\right\rfloor\right) \\ &= \Theta\left(\sqrt n\right) + \sum\limits_{i = 2}^{\sqrt n} \mathcal O\left(\sqrt\frac ni\right) \\ &= \mathcal O\left(\sum\limits_{i = 2}^{\sqrt n}\sqrt\frac ni\right) \\ &= \mathcal O\left(\int_1^{\sqrt n} \sqrt\frac ni \mathrm di\right) \\ &= \mathcal O\left(n^\frac34\right) \end{aligned} $$

众所周知的杜教筛是 $\mathcal O\left(n^\frac23\right)$ 的,原因是可以先筛出前 $m$ 个答案。复杂度变为 $\Theta\left(m\right) + \mathcal O\left(\frac n{\sqrt m}\right)$,取 $m = \Theta \left(n^\frac23\right)$ 即可。

常见函数

再看例子前,可以先看看有哪些常作为 $g\left(x\right)$ 的函数。

  • $\epsilon$ 元函数。满足 $f * \epsilon = f$。$\epsilon\left(x\right) = \left[x = 1\right]$
  • $\varphi$ 欧拉函数
  • $I$ 恒等函数。$I\left(x\right) = 1$
  • $id$ 自身函数。$id\left(x\right) = x$
  • $\mu$ 莫比乌斯函数

下面 $\left(f * g\right)\left(i\right)$ 为 $f\left(i\right)$ 与 $g\left(i\right)$ 的狄利克雷卷积。

  • $\mu * I = \epsilon$
  • $\varphi * I = id$
  • $\mu * id = \varphi$

例子

$\varphi$ 函数前缀和

由于 $\varphi * I = id$,所以取 $g = I$,那么 $f * g = id$

auto apiadu_sieve_phi = [&](auto& $, tp n) -> tp {
  if (n <= m || ps_phi.count(n)) return ps_phi[n];
  tp ret = n * (n + 1) / 2;
  for (tp l = 2, r; l <= n; l = r + 1) {
    r = n / (n / l);
    ret -= (r - l + 1) * $($, n / l);
  }
  return ps_phi[n] = ret;
};

$\mu$ 函数前缀和

由于 $\mu * I = \epsilon$,所以取 $g = I$,那么 $f * g = \epsilon$

auto apiadu_sieve_mu = [&](auto& $, tp n) -> tp {
  if (n <= m || ps_mu.count(n)) return ps_mu[n];
  tp ret = 1;
  for (tp l = 2, r; l <= n; l = r + 1) {
    r = n / (n / l);
    ret -= (r - l + 1) * $($, n / l);
  }
  return ps_mu[n] = ret;
};

$f\left(i\right) = i \times\varphi\left(i\right)$ 函数前缀和

这是一个经典例子。尽管 $f\left(i\right)$ 不再是积性函数,但我们任然可以杜教筛。

取 $g = id$,$\left(f * g\right)\left(n\right) = \sum\limits_{d \mid n} \left(\varphi\left(d\right) \cdot d\right) \cdot \frac nd = n^2$

于是我们还是可以在常数时间内计算 $\left(f * g\right)\left(i\right)$。

卡常小技巧

参考

https://www.luogu.com.cn/article/tojxbb76
https://oi-wiki.org/math/number-theory/du/
https://www.luogu.com/article/hjw4837h


No comments

Post a comment