莫比乌斯函数入门

莫比乌斯函数入门

之前遇到过很多次莫反的题,但是每次做完就忘了,云里雾里,所以写一篇来好好记忆一下,下次再忘了就回来看看。
内容和OIWIKI有很大部分的重叠,但是更偏向结论和做法,同时舍弃了一些看不懂的,大多数为别人的复述。

莫比乌斯函数定义:

\[\mu(n)=\begin{cases} 1 & n=1 \\ 0 & n含有平方因子(因子中有平方数) \\ (-1)^k & k为n本质不同的质因子个数 \end{cases} \]

性质

\(\mu(n)\)是积性函数

积性函数

\[设函数为f(ab),则f(ab) = f(a)\times f(b),且a⊥b(a,b互质) \]

性质

\[\sum_{d|n}\mu(d)=\begin{cases} 1 & n=1 \\ 0 & n\ne 1 \\ \end{cases} \]

\(n\)所有的因子的函数和的性质

证明

\[n = \prod_{i=1}^{i\leq k}p_i^{c_i},n' = \prod_{i=1}^{i\leq k}p_i \]

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

解释
容易发现\(n'\)的所有\(d\)\(n\)是都有的,发现

\[d_i = \prod_{p_i\in P}p_i \]

证明,若

\[d_i\times p_l = \prod_{p_i \in P}p_i \times p_l \]

\(p_l\)出现在\(P\)之中,则\(\mu(d_i\times P-l)=0\)
\(p_l\)不出现在\(P\)之中,\(\mu(d_i\times P-l)\)会在其它情况中被枚举
所以第一个式子是成立的,再者

\[\sum_{d|n'}\mu(d) = \sum_{i=0}^{k}C_k^i(-1)^i \]

根据二项式定理

\[(a+b)^n = \sum_{i=0}^{n}C_n^ia^ib^{n-i} \]

为上面的式子添加一个\(b=1\)

\[\sum_{i=0}^{k}C_k^i(-1)^i = (1+(-1))^k = 0 \]

\[\sum_{d|n}\mu(d)=\begin{cases} 1 & n=1 \\ 0 & n\ne 1 \\ \end{cases} \]

利用

因为\(\mu\)是积性函数,所以可以线性筛

void getMu() {
  mu[1] = 1;//初始化
  for (int i = 2; i <= n; ++i) {
    if (!flg[i]) p[++tot] = i, mu[i] = -1;//质数的情况
    for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
      flg[i * p[j]] = 1;
      if (i % p[j] == 0) {
        mu[i * p[j]] = 0;
        break;
      }
      mu[i * p[j]] = -mu[i];//多一个质因数
    }
  }
}

补充结论

\[[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d) \]

人话翻译:左边成立,右边为\(1\),反之为\(0\)
证明:略

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

莫比乌斯反演

\[f(x) = \sum_{d|x}g(d) \Longleftrightarrow g(x) = \sum_{d|x} \mu(\frac{x}{d})f(d) \]

\[f(x) = \sum_{d|x}g(d) \Longleftrightarrow g(x) = \sum_{d|x} \mu(d)f(\frac{x}{d}) \]

这两条就是莫比乌斯反演的结论。

例题

P2522 [HAOI2011] Problem b

原问题相当于询问一个矩阵,用类似于二维前缀和的方式将其拆开,每一部分都是形如:

\[\sum_{i=1}^{i\leq n}\sum_{j=1}^{j \leq m} [gcd(i,j)==k] \]

的样子,可以化简为:

\[\sum_{i=1}^{i\leq \lfloor \frac{n}{k} \rfloor}\sum_{j=1}^{j \leq \lfloor \frac{m}{k} \rfloor } [gcd(i,j)==1] \]

由之前的结论可得:

\[\sum_{i=1}^{i\leq \lfloor \frac{n}{k} \rfloor}\sum_{j=1}^{j \leq\lfloor \frac{n}{k} \rfloor} \sum_{d|gcd(i,j)} \mu(d) \]

我们枚举 \(d\),再枚举 \(d\) 的倍数 ,可得:

\[\sum_{d=1} \mu(d) \sum_{i=1}^{i\leq \lfloor \frac{n}{k} \rfloor}[d|i]\sum_{j=1}^{j \leq \lfloor \frac{n}{k} \rfloor}[d|j] \]

后面两部分都可以快速的算出,再得:

\[\sum_{d=1} \mu(d) \lfloor \frac{n}{kd} \rfloor \lfloor \frac{m}{kd} \rfloor \]

容易发现现在已经可以 \(O(n)\) 解决单次问题了,但是由多组询问,我们预处理 \(\mu\) 前缀和并使用数论分块优化。 code

SP5971 LCMSUM - LCM Sum

推狮子。

\[\sum_{i=1}^{i\leq n}lcm(i,n) = \sum_{i=1}^{i\leq n} \frac{in}{gcd(i,n)} \]

\(n\) 提出来。

\[n\sum_{i=1}^{i\leq n} \frac{i}{gcd(i,n)} \]

枚举 \(\frac{i}{gcd(i,n)}\) 可得。

\[n\sum_{d|n}\sum_{i=1}^{i\leq n}\frac{i}{d}[gcd(i,n)==d] \]

像上面一道题一样。

\[n\sum_{d|n}\sum_{i=1}^{i\leq \lfloor \frac{n}{d} \rfloor}i[gcd(i,\frac{n}{d})==1] \]

经典结论再得:

\[n\sum_{d|n}\sum_{i=1}^{i\leq \lfloor \frac{n}{d} \rfloor}\sum_{d'|gcd(i,\frac{n}{d})} \mu(d')i \]

和上面一样。

\[n\sum_{d|n}\sum_{i=1}^{i\leq \lfloor \frac{n}{d} \rfloor}\sum_{d'|gcd(i,\frac{n}{d})} \mu(d')i \]

枚举 \(d'\) 得:

\[n\sum_{d|n}\sum_{d'|\frac{n}{d}}\mu(d')d'\sum_{i=1}^{\lfloor \frac{n}{dd'} \rfloor}i \]

\(S(n) = \frac{n(n+1)}{2}\)

\[n\sum_{d|n}\sum_{d'|\frac{n}{d}}S(\lfloor \frac{n}{dd'} \rfloor)\mu(d')d' \]

\(dd' = M\)

\[n\sum_{d|n}\sum_{d'|\frac{n}{d}}S(\lfloor \frac{n}{M} \rfloor)\mu(d')d' \]

枚举 \(M\)

\[n\sum_{M|n}S(\lfloor \frac{n}{M} \rfloor)\sum_{d|M}\mu(d)d \]

筛出后面这一坨东西,可以一次一次地分开筛。code

杜教筛

一个能在 \(O(n^\frac{2}{3})\) 内求出积性函数前缀和的筛子。

定义

\(\epsilon(n)\):元函数,返回 \([n==1]\)
\(I(n)\):恒等函数,返回值为 \(1\)
\(id(n)\):单位函数,返回值为 \(n\)

狄利克雷卷积

定义两个数论函数 \(f\)\(g\) 的狄利克雷卷积为 \((f*g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})\)
这个东西满足结合律,交换律。

实际上莫比乌斯繁反演就是 \(\mu * I = \epsilon\)
还有式子,\(\mu * id = \phi\)\(\phi * I = id\)

流程

假设我们有一个积性函数 \(f(n)\),若我们能够快速得到另一个积性函数 \(g(n)\) 前缀和,和他们的狄利克雷卷积 \((f*g)(n)\) 前缀和。
这样我们就能够通过杜教筛快速得到 \(f(n)\) 的前缀和。
我们知道:

\[\sum_{i=1}^{i \leq n}(f*g)(i) = \sum_{d|i} f(d)g(\frac{i}{d}) \]

并枚举 \(g(n)\),则有:

\[\sum_{d = 1}^{d \leq n} g(d) \sum_{i = 1}^{i \leq \lfloor \frac{n}{d} \rfloor} f(i) \]

\(\sum_{i = 1}^{n} f(i)\)\(S(n)\),表示前缀和,则改为:

\[\sum_{d = 1}^{d \leq n} g(d)S(\lfloor \frac{n}{d} \rfloor) \]

同时有:

\[g(1)S(n) = \sum_{i=1}^{i \leq n} g(i)S(\lfloor \frac{n}{i} \rfloor)-\sum_{i=2}^{i \leq n} g(i)S(\lfloor \frac{n}{i} \rfloor) \]

也就是说:

\[S(n) = \frac{\sum_{i=1}^{i\leq n}(f*g)(n)-\sum_{i=2}^{i \leq n} g(i)S(\lfloor \frac{n}{i} \rfloor)}{g(1)} \]

然后我们对后面的 \(S(\lfloor \frac{n}{i} \rfloor)\) 进行整除分块,并且递归求解。
通过 unordered_map 记忆化和提前筛出前 \(n^{\frac{2}{3}}\)\(S(i)\),可以做到 \(O(n^{\frac{2}{3}})\) 回答前缀和。

\(\mu(n)\)

我们知道 \(\mu * I = \epsilon\),则有

int gmu(int x)
{
    if(x < V-5) return smu[x] ;//提前筛除mu的前缀和
    if(Smu.find(x) != Smu.end()) return Smu[x] ;//记忆化
    int res = 1 ;//前缀和为 1
    for(int le = 2,ri ; le <= x ; le = ri+1)
        ri = min(x,x/(x/le)),res -= (ri-le+1)*gmu(x/le) ; return Smu[x] = res ;
}
\(\phi(n)\)

我们知道 \(\phi * I = id\)
代码差不多,就是算 \((f*g)(n)\) 的方法有点不一样。

int gphi(int x)
{
    if(x < V-5) return sphi[x] ;
    if(Sphi.find(x) != Sphi.end()) return Sphi[x] ; int res = (x+1)*x/2ll ;
    for(int le = 2,ri ; le <= x ; le = ri+1)
        ri = min(x,x/(x/le)),res -= (ri-le+1)*gphi(x/le) ; return Sphi[x] = res ;
}

\(\phi(n)n^2\) \(\Delta\)

先推一下式子:

\[\sum_{i=1}^{i \leq n} \sum_{j=1}^{j \leq n} ijgcd(i,j) \]

\(gcd\) 不太好看,化成 \(\phi\) 的形式。

\[\sum_{i=1}^{i \leq n} \sum_{j=1}^{j \leq n} ij \sum_{d|gcd(i,j)}\phi(d) \]

所以枚举 \(d\),则有:

\[\sum_{d=1}^{d\leq n}\phi(d)d^2\sum_{i=1}^{i\leq\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{i\leq\lfloor \frac{n}{d} \rfloor}ij \]

我们会发现后面两个循环是有通项公式的,记为 \(S(n)\),也就是说我们要求的是:

\[\sum_{d=1}^{d\leq n}\phi(d)d^2S(\frac{n}{d}) \]

显然可以对 \(S(n)\) 进行整除分块,考虑如何求出 \(\phi(i)i^2\) 的前缀和。
注意到这比普通的 \(\phi(i)\) 多出了一个 \(i^2\),所以将 \(g\) 函数构造为 \(id^2\),所以在狄利克雷卷积时有:

\[(f*g)(n) = \sum_{d|n} \phi(d)d^2 (\frac{n}{d})^2=n^2\sum_{d|n}\phi(d)=n^3 \]

显然这个 \(\sum(f*g)(n)\) 也有通项公式,然后这题就做完了。
需要注意的是即使外面有一层整除分块,但时间仍然为 \(O(n^{\frac{2}{3}})\)

...

后面有时间了再更,就当入个门

posted @ 2023-07-04 21:03  谭皓猿  阅读(60)  评论(0)    收藏  举报