【学习笔记】杜教筛
前置知识:狄利克雷卷积
杜教筛
给定正整数 \(n(n\le 2^{31})\),求 \(\sum\limits_{i=1}^nf(i)\),其中 \(f\) 为一积性函数。
令 \(S(n)=\sum\limits_{i=1}^nf(i)\)。
首先,我们找一个神奇的函数 \(g\),使得 \(\sum\limits_{i=1}^n(f*g)(i)\) 和 \(\sum\limits_{i=1}^ng(i)\) 都能快速求解。
然后我们需要证明 \(\sum\limits_{i=1}^n(f*g)(i)=\sum\limits_{i=1}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\)。
\(\sum\limits_{i=1}^n(f*g)(i)\\=\sum\limits_{i=1}^n\sum\limits_{d\mid i}g(d)f(\dfrac{i}{d})\\=\sum\limits_{d=1}^n\sum\limits_{i=1}^n[d\mid i]g(d)f(\dfrac{i}{d})\\=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^n[d\mid i]f(\dfrac{i}{d})\\=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}f(i)\)
(其中这一步是将枚举 \(i\) 变为枚举 \(\dfrac{i}{d}\),原 \(i\) 变为 \(id\))
\(=\sum\limits_{i=1}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\)
证毕。
\(\sum\limits_{i=1}^n(f*g)(i)=\sum\limits_{i=1}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\\\sum\limits_{i=1}^n(f*g)(i)=g(1)S(n)+\sum\limits_{i=2}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\\g(1)S(n)=\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{i=2}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\\S(n)=\dfrac{\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{i=2}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)}{g(1)}\)
于是 \(S(n)\) 就能用整除分块递归求解了,并用 map
或 tr1 :: unordered_map
记忆化。
但此时时间复杂度为 \(\mathcal{O}(n^{\frac{3}{4}})\)(证明),还是有点高,怎么办?
我们可以预处理出 \(1..k\) 的 \(S(n)\) 值(线性筛 + 前缀和),当 \(n\le k\) 时直接返回。
\(k=n^\frac{2}{3}\) 时时间复杂度较优,为 \(\mathcal{O}(n^\frac{2}{3})\)。
应用
- 莫比乌斯函数
令 \(g=1\),此时有 \(\mu*1=\epsilon\)。
\(S(n)=\dfrac{\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{i=2}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)}{g(1)}\\=\sum\limits_{i=1}^n\epsilon(i)-\sum\limits_{i=2}^n1(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)\\=1-\sum\limits_{i=2}^nS(\left\lfloor\dfrac{n}{i}\right\rfloor)\)
- 欧拉函数
令 \(g=1\),此时有 \(\varphi*1=id\)。
\(S(n)=\dfrac{\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{i=2}^ng(i)S(\left\lfloor\dfrac{n}{i}\right\rfloor)}{g(1)}\\=\sum\limits_{i=1}^nid(i)-\sum\limits_{i=2}^nS(\left\lfloor\dfrac{n}{i}\right\rfloor)\\=\dfrac{n(n+1)}{2}-\sum\limits_{i=2}^nS(\left\lfloor\dfrac{n}{i}\right\rfloor)\)