數論相關
積性函式
推論1:積性函式 \(f\) 一定滿足 \(f(1) = 1\)。
推論2:透過質數點值可以唯一確定完全積性函式,因為質數可以組成所有的數;透過所有 \(p^k\) 處的點值可以唯一確定積性函式,因為積性函式有前置條件 \(n \bot m\) 所以要組合出有多個質因子 \(p\) 的數就需要 \(p^k\) 處的點值。
Dirchlet 卷積
Dirchlet 卷積有類似於乘法的性質:
-
交換律
-
結合律
-
單位元,即 $ \epsilon(n) = [n = 1]$。
-
兩個積性函式的 Dirchlet 卷積依舊是積性函式。
-
積性函式的 Dirchlet 逆依舊是積性函式。
計算
Dirchlet卷積可以直接計算,複雜度就是調和級數 \(O(nlogn)\)。
Dirchlet逆依舊可以直接計算:
有函式 \(f\),需要求出 \(g\) 滿足 \(f \otimes g = \epsilon\)。
那麼顯然就有 \(f(1)g(1) = 1\),則 \(g(1) = \frac{1}{f(1)}\)。當 \(n \geq 2\) 時,則有
常用數論函式
\(\epsilon(n) = [n = 1]\)
\(id_k(d) = d^k\)
\(\sigma_k(n) = \sum_{d|n} d^k\)
\(\mu(n)\)
\(\varphi(n)\)
性質;
\(\mu \otimes 1 = \epsilon\)
\(\varphi \otimes 1 = id\)
\(\mu \otimes id = \varphi\) (這個可以拿前兩個推)
\(1 \otimes 1 = d\)
\(1 \otimes id_k = \sigma_k\)
莫比烏斯反演
證明很簡單:
聯絡子集反演:
我們知道 \(s\) 是一個集合,而 \(d\) 可以看作是所有質因子的多重集,所以二者很相似,我們可以這樣理解,如果 \(n = \prod p\),也就是所有質因子質數為1,那麼就和子集反演完全等價,就可以理解 \((-1)^{|S| - |T|} = \mu(n / d)\)。
整除分塊
這個很牛,考慮一個問題,我們固定一個不變 \(n\),那麼所有的 \(\lfloor \frac{n}{x} \rfloor\) 有多少種取值?
答案是 \(O(\sqrt n)\) 種,證明:
\(x \leq \sqrt n\) 時,顯然有 \(O(\sqrt n)\) 種,因為 \(x\) 只有 \(\sqrt n\) 個。
\(x > \sqrt n\) 時,因為 \(\lfloor \frac{n}{x} \rfloor \leq \sqrt n\) ,所以也只有 \(O(\sqrt n)\) 種。
那麼 \(\lfloor \frac{n}{x} \rfloor\) 的取值就是若干個顏色段,只要我們可以 \(O(1)\) 的求出邊界是多少,那麼就可以 \(O(\sqrt n)\) 的算出 \(\sum \lfloor \frac{n}{x} \rfloor\)!
現在我們知道一個顏色段的左端點 \(l\),考慮設右端點為 \(r\),那麼就有:
所以 \(\large r = \frac{n}{\lfloor \frac{n}{l} \rfloor}\)。
多維形式
也就是有多維,以兩維為例,我需要求 \(\sum \lfloor \frac{n}{i}\rfloor \lfloor \frac{m}{i}\rfloor\),分析一下發現顏色段還是 \(O(\sqrt n)\) 級別,如果維數過大,那麼就是 \(O(k \sqrt n)\) 。我們每次 \(r\) 取 \(\large min(\frac{n}{\lfloor \frac{n}{l} \rfloor}, \frac{m}{\lfloor \frac{m}{l} \rfloor})\)即可。
篩法
線性篩
篩 \(\mu\) 和 \(\varphi\)
我們就考慮線性篩時的兩種情況:
-
\(i \% p \neq 0\) 時,那麼對於 \(\varphi\) 就是用積性函式性質 \(\varphi(i * p) = \varphi(i) * \varphi(p) = \varphi(i) * (p - 1)\), 對於 \(\mu\) 就是多了一個不同質因子 \(\mu(i * p) = -\mu(i)\)。
-
\(i \% p = 0\)時,我們用上面 \(\varphi\) 的公式就發現 \(\varphi(i * p) = \varphi(i) * p\),對於 \(\mu(i * p)\) 就直接變成 \(0\)。
篩一般的積性函式
由前面推論2我們知道,題面肯定會給在 \(p\) 或者 \(p_k\) 的點值,這個點值的計算我們姑且聲稱他的時間複雜度為 \(O(logn)\)。那我們怎麼用線性篩篩出所有的呢?
我們知道線性篩是用最小質因子來篩的,那麼設 \(n = p_0^{k_0} \prod p_i^{k_i}\),我們欽定 \(p_0\) 為最小質因子,\(m = \prod p_i^{k_i}\),那麼我們用 \(p_0\) 篩 \(n\) 的時候就可以 \(f(n) = f(m) * f(p_0^{k_0})\),我們就只需要知道最小質因子的次數,這線上性篩的過程中就可以做到,很簡單。
杜教篩
杜教篩是比較基礎的亞線性篩法。 可以在低於線性的複雜度篩出積性函式的字首和。
我們現在除了化式子拆掉 \(\sum\),能加速求和的就只有整除分塊了,所以我們需要構造出來跟除法有關,嘗試用 Dirchlet 卷積,若我們現在要求 \(f\),所以我們需要構造一個 \(g\),透過 \(g\) 來求出 \(f\),一個方法就是卷積起來在拆開,我們嘗試化一下式子。
觀察到 \(\sum_{i = 1}^{n / d}f(i)\) 只有 \(O(\sqrt n)\) 個取值,\(g\) 是我們所構造的,如果我們能構造出容易計算的 \(g\) 和 \(f \otimes g\),那麼就可以快速算出答案。
方便描述,我們成全體 \({S_f(\lfloor n / x \rfloor)}\) 為 \(f\) 的基本和組。
可以分析得出時間複雜度 \(O(n^{\frac{3}{4}})\),並且如果可以,可以 \(O(n)\) 篩出前 \(n^{\frac{2}{3}}\) 項,大於 \(n^{\frac{2}{3}}\) 的就遞迴計算。
上面的是已知 \(f \otimes g\) 的基本和組和 \(g\) 的基本和組,求 \(f\) 的基本和組。
如果我們已知 \(f\) 和 \(g\) 的基本和組,我們一樣可以類似杜教篩的求 \(f \otimes g\) 的基本和組。
直接拿這個算和上面本質相同。
我們還有另外一個方法。
狄利克雷雙曲線法
我們用一下簡單的容斥。
注意到 \(xy \leq n\) 是一個雙曲線,我們可以這樣容斥,如圖。
這是一個雙曲線,我們把所有的 \(f(x)g(y)\) 看作點 \((x, y)\),那麼藍色部分就是 \(y \leq \sqrt n\) 的點集,紅色部分就是 \(x \leq \sqrt n\) 的點集,相交部分就是同時滿足兩個條件的。
所以我們可以算出藍色部分和紅色部分再減去相交的部分,用式子表述就是:
這個東西複雜度沒有變化,但是聽說常數比較小。感覺上也更妙一些。。。
Powerful Number 篩
這個東西要暴力一些,比杜教篩更現代。 而且更快。