Oi-Wiki上說學習莫比烏斯反演須要Dirichlet 卷積,其實不學它也沒有什麼問題。函數
能夠用到整除分塊的形式,大體是這樣的:學習
這個 \(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
這就是莫比烏斯函數。
應該比較好理解。
莫比烏斯函數也有一些性質:code
再就是線性篩莫比烏斯函數: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)\) 和 \(f(n)\) 知足 :
那麼能夠得:
感受這個式子,可能在莫比烏斯反演中更加好用。
莫比烏斯反演是一個學會了也不會作題的知識,因此只有多推式子,才能用熟它,多作題吧。