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
我也不知道什麼是"莫比烏斯反演"和"杜教篩"
淺談一類積性函數的前綴和