杜教篩入門

Orz  OO0OOO00O0OOO0O00OOO0OOhtml

前置知識

狄利克雷卷積函數

杜教篩

套路

杜教篩是用來求一類積性函數的前綴和

它經過各類轉化,最終利用數論分塊的思想來下降複雜度

假設咱們如今要求$S(n) = \sum_{i = 1}^n f(i)$,$f(i)$爲積性函數,$n \leqslant 10^{12}$

直接求確定是很差求的,不過如今假設有另外一個積性函數$g$

咱們來求它們狄利克雷卷積的前綴和

$$\sum_{i = 1}^n (g * f) = \sum_{i = 1}^n \sum_{d \mid i} g(d) f(\frac{i}{d})$$

$$= \sum_{d = 1}^n g(d) \sum_{d|i} f(\frac{i}{d})$$

$$= \sum_{d = 1}^n g(d) \sum_{i = 1}^{\frac{n}{d}}f(i)$$

$$= \sum_{d = 1}^n g(d) S(\frac{n}{d})$$

而後就化不動了,不過咱們發現咱們化出了$\frac{n}{d}$!excited

可是$S(n)$怎麼求呢?

容斥一下

$$g(1)S(n) = \sum_{d = 1}^n g(d)S(\frac{n}{d}) - \sum_{d = 2}^n g(d)S(\frac{n}{d})$$


前半部分是狄利克雷卷積的前綴和的形式

後半部分能夠數論分塊。這樣看起來就好搞多了

如今咱們的問題是,如何選擇$g$才能使得上面這個式子好算

這個就要因狀況而定了

下面煮幾個典型栗子

$\mu$函數

定理:$\sum_{d \mid n} \mu(d) = [n = 1]$post

那麼咱們若是選擇$g = 1(i)$,學習

這樣對於每一項,$(g * f)(i) = \sum_{d \ | i} 1 * \mu(\frac{i}{d}) = e$spa

其中$e$爲原函數,$e = [n = 1]$.net

所以$g$與$\mu$的卷積的前綴和確定爲$1$code

上面的式子變爲htm

$S(n) = 1 - \sum_{d = 2}^n S(\frac{n}{d})$blog

後半部分直接數論分塊就好ci

 

$\varphi$函數

定理:$\sum_{d \mid n}\varphi(d) = n$

咱們的$g$仍是選$1$作卷積

那麼$(g * f)(i) = \sum_{d \ | i} 1 \varphi(\frac{i}{d}) = i$

所以$\sum_{i = 1}^n g * f = \frac{n (n + 1)}{2}$

咱們要求得式子變爲

$$S(n) = \frac{n * (n + 1)}{2} - \sum_{d = 2}^n S(\frac{n}{i})$$

前半部分$O(1)$算,後半部分數論分塊

題目

目前沒有作多少題目,並且個人杜教篩是分兩波學的,因此碼風差別可能比較大qwq。

洛谷P4213 Sum

BZOJ4805

BZOJ4916

若是須要真·杜教篩題目的話能夠去看糖教的博客

https://blog.csdn.net/skywalkert/article/details/50500009

參考資料

杜教篩——省選前的學習1

我也不知道什麼是"莫比烏斯反演"和"杜教篩"

淺談一類積性函數的前綴和

相關文章
相關標籤/搜索