莫比烏斯函數總結


莫比烏斯函數總結

性質\(\sum_{d|n}\mu(d)=[n==1]\)
這個可以用組合數的性質來證,形象點的話就是楊輝三角。
因為恆等式:\(\sum_{i=0}^{n}(-1)^nC_{n}^{i}=0\).

莫比烏斯反演:
形式一:
已知:\(g(n)=\sum_{d|n}f(d)\),則有:\(f(n)=\sum_{d|n}\mu(d)g(\frac{n}{d})\).
證明如下:

\[\sum_{d|n}\mu(d)g(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k) \]

交換求和次序,有:

\[\begin{aligned} &\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)\\ =&\sum_{k|n}f(k)\sum_{d|\frac{n}{k}}\mu(d)\\ =&\sum_{k|n}f(k)[\frac{n}{k}=1]=f(n) \end{aligned} \]

故得證.
形式二:
已知:\(g(n)=\sum_{n|d}f(d)\),則有:\(f(n)=\sum_{n|d}\mu(\frac{d}{n})g(d)\).
證明如下:
\(k=\frac{d}{n}\),則有:

\[\begin{aligned} &\sum_{n|d}\mu(\frac{d}{n})g(d)\\ =&\sum_{k=1}^{\infty}\mu(k)g(nk)\\ =&\sum_{k=1}^{\infty}\mu(k)\sum_{nk|t}f(t) \end{aligned} \]

交換求和次序,有:

\[\begin{aligned} &\sum_{k=1}^{\infty}\mu(k)\sum_{nk|t}f(t)\\ =&\sum_{n|t}f(t)\sum_{k|\frac{t}{n}}\mu(k)\\ =&\sum_{n|t}f(t)[\frac{t}{n}=1]=f(n) \end{aligned} \]

故得證.

常用技巧(應用):
一個性質:

\[\lfloor\frac{\lfloor\frac{x}{a}\rfloor}{b}\rfloor=\lfloor\frac{x}{ab}\rfloor \]

證明如下:
\(y=\lfloor\frac{x}{a}\rfloor,z=\lfloor\frac{x}{ab}\rfloor\),顯然有:\(x=zab+c,c\leq ab\).
等式兩邊同時除以\(a\)並向下取整有:\(y=zb+\lfloor\frac{c}{a}\rfloor\).
再同時除以\(b\)並向下取整:\(\lfloor\frac{\lfloor\frac{x}{a}\rfloor}{b}\rfloor=z+\lfloor\frac{\lfloor\frac{c}{a}\rfloor}{b}\rfloor\).
之后就比較顯然了。

整除分塊:
整除分塊經常在相關數論問題中用到,主要是用來解決下列求和式:

\[\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor \]

證明我就不寫了,就說點有用的性質吧:

  • 對於\(1\leq i\leq n\)\(\lfloor\frac{n}{i}\rfloor\)只有至多\(2\sqrt{n}\)個不同取值。
  • 對於任一\(x\),當\(x\leq i\leq \lfloor\frac{n}{\lfloor\frac{n}{x}\rfloor}\rfloor\)時,\(\lfloor\frac{n}{i}\rfloor\)的值都相等。

有了上面兩個性質,那么可以加速求和式,復雜度為\(\sqrt{n}\)

例一:
求:\(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=1]\).

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=1]\\ =&\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i,j)}\mu(d)\\ =&\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i,d|j}\mu(d) \end{aligned} \]

說明一下:從第一步到第二步多出來一個和式,就相當於一個容斥的過程,考慮所有的\((i,j)\),對於他們的\(gcd\)來進行容斥:先加上所有的情況,然后減去\(gcd\)\(2,3,5...\)倍數的情況,但會多減,所以加回來。
之后再進行變換得:

\[\begin{aligned} &\sum_{d}\mu(d)\sum_{i=1}^{n}\sum_{d|i}\sum_{j=1}^{m}\sum_{d|j}\\ =&\sum_{d}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \end{aligned} \]

后面的部分直接整除分塊,然后預處理\(\mu\)的前綴和就行了。

例二:
求:\(\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)\)

這個和第一個比較類似,我們變化一下就有:

\[\begin{aligned} &\sum{d}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=d]\\ =&\sum{d}\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}[gcd(i,j)=1] \end{aligned} \]

根據例一得:

\[\begin{aligned} &\sum{d}\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}[gcd(i,j)=1]\\ =&\sum{d}\sum_t\mu(t)\lfloor\frac{n}{dt}\rfloor\lfloor\frac{m}{dt}\rfloor \end{aligned} \]

\(T=dt\),則上式可化為:

\[\begin{aligned} =&\sum{\frac{T}{t}}\sum_{t}\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\ =&\sum_{T}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{t|T}\mu(t)\frac{T}{t}\\ =&\sum_T\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\varphi(T) \end{aligned} \]

說說為什么最后轉化為了歐拉函數:
歐拉函數有個十分有用的性質:\(\sum_{d|n}\varphi(d)=n\),證明的話主要從\(f(n)=\sum_{d|n}\varphi(d)\)這個函數為積性函數入手。同時還有兩個個性質也比較有用:一個是\(\varphi(p^m)=p^m-p^{m-1}\),另一個是小於\(n\)的數中,與\(n\)互質的數的和為\(\frac{n\varphi(n)}{2},n>1\),為什么呢?因為有\(gcd(m,n)=gcd(n,n-m),所以是成對的~\)
回到正題,有了這個式子反演一下就有:

\[\varphi(n)=\sum_{d|n}\mu(d)\frac{n}{d} \]

對於例二,整除分塊+預處理歐拉函數就行了。

相關例題:
洛谷P1829

題意:
\(\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)\)

思路:
推導過程如下:

\[\begin{aligned} &\sum_{i=1}^n \sum_{j=1}^m lcm(i,j)\\ =&\sum_{i=1}^n \sum_{j=1}^m \frac{ij}{gcd(i,j)}\\ =&\sum_d\sum_i\sum_j\frac{ij}{d}(gcd(i,j)=d)\\ =&\sum_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijd(gcd(i,j)=1)\\ =&\sum_dd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij(gcd(i,j)=1) \end{aligned} \]

后面部分是不是很熟悉,我們先求\(sum(n,m)=\sum_i\sum_jij(gcd(i,j)=1)\).
按照套路,有:

\[\begin{aligned} sum(n,m)=&\sum_i\sum_jij\sum_{d|gcd(i,j)}\mu(d)\\ =&\sum_d d^2\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij \end{aligned} \]

后面部分為兩個等差數列求和,顯然可以直接數論分塊來搞。
回到原式:

\[\sum_d d\cdot sum(\lfloor\frac{n}{d}, \frac{m}{d}\rfloor) \]

發現這后面也可以數論分塊搞,所以就是分塊套分塊,總復雜度為\(O(n)\)

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7 + 5, MOD = 20101009;
int n, m;
int mu[N], p[N], sum[N];
bool chk[N];
void init() {
    mu[1] = 1;
    int cnt = 0, k = min(n, m);
    for(int i = 2; i <= k; i++) {
        if(!chk[i]) p[++cnt] = i, mu[i] = -1;
        for(int j = 1; j <= cnt && i * p[j] <= k; j++) {
            chk[i * p[j]] = 1;
            if(i % p[j] == 0) {mu[i * p[j]] = 0; break;}
            mu[i * p[j]] = -mu[i];
        }
    }
    for(int i = 1; i <= k; i++) sum[i] = ((sum[i - 1] + 1ll * mu[i] * i * i % MOD) % MOD + MOD) % MOD;
}
int Sum(int x) {
    return 1ll * x * (x + 1) / 2 % MOD;
}
int calc(int n, int m) {
    int ans = 0;
    for(int i = 1, j; i <= min(n, m); i = j + 1) {
        j = min(n / (n / i), m / (m / i));
        ans = (ans + 1ll * (sum[j] - sum[i - 1] + MOD) * Sum(n / i) % MOD * Sum(m / i) % MOD) % MOD;
    }
    return ans;
}
int solve(int n, int m) {
    int ans = 0;
    for(int i = 1, j; i <= min(n, m); i = j + 1) {
        j = min(n / (n / i), m / (m / i));
        ans = (ans + 1ll * (i + j) * (j - i + 1) / 2 % MOD * calc(n / i, m / i) % MOD) % MOD;
    }
    return ans;
}
int main() {
#ifdef heyuhhh
    freopen("input.in", "r", stdin);
#else
    ios::sync_with_stdio(false); cin.tie(0);
#endif
    cin >> n >> m;
    init();
    cout << solve(n, m);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM