莫比烏斯反演學習筆記

莫比烏斯反演學習筆記

Oi-Wiki上說學習莫比烏斯反演須要Dirichlet 卷積,其實不學它也沒有什麼問題。函數

前置知識

整除分塊

能夠用到整除分塊的形式,大體是這樣的:學習

\[\sum_{i=1}^{n}(n/i) \]

這個 \(O(n)\) 很是好寫,可是題目提升了要求,必須 \(O(\sqrt n)\) 把它求出來。
很是顯然的,許多數向下取整是相同的,而且是呈塊狀分佈的,咱們能夠藉助這個性質來求它。
咱們發現對於每個值相同的塊,它的最後一個數就是 \(n/(n/i)\) 。得出這個結論後,咱們就能夠作的 \(O(\sqrt n)\)處理了。
證實:考慮把 \(n/(n/i) + 1\) 後再乘 \(n/i\),不難發現已經大於 n 了,得證。ui

for(register int l = 1, r; l <= n; l = r+1) {
	r = n / (n/l);
	ans += (r-l+1) * (n/l);
}
  • 與其餘函數的聯繫
    有時候,可能推出來的式子不必定就是一個很裸的整除分塊,可能會與某些積性函數相乘,如:\(μ,φ\)...... 這時候,咱們就須要對這些函數統計一個前綴和。由於,每當咱們使用整除分塊跳過一個區間的時候,其所對應的函數值也跳過了一個區間。因此此時,就須要乘上那一個區間的函數值。

莫比烏斯函數

莫比烏斯函數實際上是一個很是簡單的函數。
設正整數 \(N\) 質因數分解後爲 \(N = p_1^{c_1} * p_2^{c_2} * ... * p_m^{c_m}\),定義函數:spa

\[\mu(N) =\begin{cases} 0 (任意c_i>1)\\1(m \equiv 0(mod2))\\-1(m \equiv 1(mod2)) \end{cases} \]

這就是莫比烏斯函數。
應該比較好理解。
莫比烏斯函數也有一些性質:code

  • 對於任意正整數 \(n\),都有 \(\sum_{d | n}^{}\mu(d) = [n == 1]\)
    就是說除了 n 爲 1,其餘的都是0。
    這個就是用μ是容斥係數的性質能夠證實。
    能夠考慮用組合數的性質證實。
    這一條性質是莫比烏斯反演中最經常使用的
  • 對於任意正整數 \(n\),都有 $ \sum_{d|n}\mu(d) / d = \varphi(n)/n$
    這個暫時我證實不出來。

再就是線性篩莫比烏斯函數class

bool vis[N];
int mu[N], prime[N], tot;
void shai(int n) {
	mu[1] = 1;
	for(register int i = 2; i <= n; ++i) {
		if(!vis[i]) { mu[i] = -1; prime[++tot] = i;}
		for(register int j = 1; j <= tot && prime[j] * i <= n; ++j) {
			vis[prime[j] * i] = 1;
			if(i % prime[j] == 0) break;
			else mu[i * prime[j]] = -mu[i];
		}
	}
}

感受很好理解。學習筆記

正文

終於到了莫比烏斯反演了,其實學了折磨多前置知識後,莫比烏斯反演就是個式子。
\(F(n)\)\(f(n)\) 是定義在非負整數上的函數,且知足:im

\[F(n) = \sum_{d|n}f(d) \]

那麼就有 :統計

\[f(n) = \sum_{d|n}\mu(d)F(n/d) \]

這就是莫比烏斯反演定理總結

證實

莫比烏斯反演的證實主要有兩種方式,其中一種就是經過定義來證實 ; 另一種就是利用狄利克雷卷積證實,咱們只說第一種:

\[\sum_{d|n}\mu(d)F(n/d) = \sum_{d|n}\mu(d)\sum_{i|(n/d)}f(i) = \sum_{i|n}f(i)\sum_{d|(n/i)}\mu(d) = f(n) \]

由此得證。
若是不知道最後一步怎麼來的,能夠再去看性質一,至於和式的變換,就本身腦補一下吧

莫比烏斯反演的另外一種形式:
\(F(n)\)\(f(n)\) 知足 :

\[F(n) = \sum_{n|d}f(d) \]

那麼能夠得:

\[f(n) = \sum_{n|d}\mu(d/n)F(d) \]

感受這個式子,可能在莫比烏斯反演中更加好用。

總結

莫比烏斯反演是一個學會了也不會作題的知識,因此只有多推式子,才能用熟它,多作題吧。

相關文章
相關標籤/搜索