Unverified Commit 73abc055 authored by Angel_Kitty's avatar Angel_Kitty Committed by GitHub
Browse files

Merge pull request #1863 from sshwy/mobius

fix(mobius): typo and code format
parents 03b9d72a ae9e77eb
Loading
Loading
Loading
Loading
+309 −313
Original line number Diff line number Diff line
@@ -8,9 +8,7 @@ author: hydingsy, hyp1231

* * *

## 数论分块与整除相

先补一下数学小 trick
## 前置知识

### 引理 1

@@ -178,16 +176,15 @@ $$

反演结论: $\displaystyle [gcd(i,j)=1] \iff\sum_{d\mid\gcd(i,j)}\mu(d)$ 

-    **直接推导** :如果看懂了上一个结论,这个结论稍加思考便可以推出:如果 $\gcd(i,j)=1$ 的话,那么代表着我们按上个结论中枚举的那个 $n$ 是 $1$ ,也就是式子的值是 $1$ ,反之,有一个与 $[\gcd(i,j)=1]$ 相同的值: $0$ 
 **直接推导** :如果看懂了上一个结论,这个结论稍加思考便可以推出:如果 $\gcd(i,j)=1$ 的话,那么代表着我们按上个结论中枚举的那个 $n$ 是 $1$ ,也就是式子的值是 $1$ ,反之,有一个与 $[\gcd(i,j)=1]$ 相同的值: $0$ 

-    **利用 $\varepsilon$ 函数** :根据上一结论, $[\gcd(i,j)=1]\implies \varepsilon(\gcd(i,j))$ ,将 $\varepsilon$ 展开即可。
 **利用 $\varepsilon$ 函数** :根据上一结论, $[\gcd(i,j)=1]\implies \varepsilon(\gcd(i,j))$ ,将 $\varepsilon$ 展开即可。

### 线性筛

由于 $\mu$ 函数为积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法不尽相同)。

 **代码**

???+ note "线性筛实现"
    ```cpp
    void getMu() {
      mu[1] = 1;
@@ -255,7 +252,7 @@ $$

### 证明

-    **暴力计算**
方法一:对原式做数论变换。

$$
\sum_{d\mid n}\mu(d)f(\frac{n}{d})=\sum_{d\mid n}\mu(d)\sum_{k\mid \frac{n}{d}}g(k)=\sum_{k\mid n}g(k)\sum_{d\mid \frac{n}{k}}\mu(d)=g(n)
@@ -263,7 +260,7 @@ $$

用 $\displaystyle\sum_{d\mid n}g(d)$ 来替换 $f(\dfrac{n}{d})$ ,再变换求和顺序。最后一步转为的依据: $\displaystyle\sum_{d\mid n}\mu(d)=[n=1]$ ,因此在 $\dfrac{n}{k}=1$ 时第二个和式的值才为 $1$ 。此时 $n=k$ ,故原式等价于 $\displaystyle\sum_{k\mid n}[n=k]\cdot g(k)=g(n)$ 

-    **运用卷积**
方法二:运用卷积。

原问题为:已知 $f=g*1$ ,证明 $g=f*\mu$ 

@@ -320,10 +317,9 @@ $$

很显然,式子可以数论分块求解(注意:过程中默认 $n\leqslant m$ )。

 **时间复杂度** : $\Theta(N+T\sqrt{n})$ 

 **代码**
 **时间复杂度 $\Theta(N+T\sqrt{n})$ ** 

??? note "代码实现"
    ```cpp
    #include <algorithm>
    #include <cstdio>
@@ -420,8 +416,7 @@ $$

 **时间复杂度** : $\Theta(n\log n)$ 

 **代码**

??? note "代码实现"
    ```cpp
    #include <cstdio>
    const int N = 1000000;
@@ -529,8 +524,7 @@ $$

时间复杂度: $\Theta(n+m)$ (两次数论分块)

代码:

??? note "代码实现"
    ```cpp
    #include <algorithm>
    #include <cstdio>
@@ -642,6 +636,7 @@ $$

那么 $O(n)$ 预处理 $\mu,d$ 的前缀和, $O(\sqrt{n})$ 分块处理询问,总复杂度 $O(n\sqrt{n})$ .

??? note "代码实现"
    ```cpp
    #include <algorithm>
    #include <cstdio>
@@ -734,6 +729,7 @@ $$

分块递归求解即可,复杂度 $O(n^{\frac{2}{3}})$ .

??? note "代码实现"
    ```cpp
    #include <cmath>
    #include <cstdio>
@@ -801,6 +797,54 @@ signed main() {
    }  //不要为了省什么内存把数组开小。。。卡了好几次80
    ```

 **解法二** 

转化一下,可以将式子写成

$$
\begin{eqnarray}
&&\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijd\cdot[gcd(i,j)=1]\\
&=&\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum_{t\mid gcd(i,j)}\mu(t)\\
&=&\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(t)[t\mid gcd(i,j)]\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij[1\mid gcd(i,j)]\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij
\end{eqnarray}
$$

容易知道

$$
\sum_{i=1}^{n}\sum_{j=1}^{m}ij=\frac{n(n+1)}{2}\cdot \frac{m(m+1)}{2}
$$

设 $sum(n,m)=\sum_{i=1}^{n}\sum_{j=1}^{m}ij$ ,继续接着前面的往下推

$$
\begin{eqnarray}
&&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\cdot sum(\lfloor\frac{n}{td}\rfloor,\lfloor\frac{m}{td}\rfloor)\\
&=&\sum_{T=1}^{n}sum(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)\sum_{d\mid T}d\cdot (\frac{T}{d})^2\mu(\frac{T}{d})\\
&=&\sum_{T=1}^{n}sum(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)(T\sum_{d\mid T}d\cdot\mu(d))
\end{eqnarray}
$$

这时我们只要对每个 $T$ 预处理出 $T\sum_{d\mid T}d\cdot\mu(d)$ 的值就行了,考虑如何快速求解

设 $f(n)=\sum_{d\mid n}d\cdot\mu(d)$ 

实际上 $f$ 可以用线性筛筛出,具体的是

$$
f(n)=
\begin{cases}
1-n &,n\in primes \\
f(\frac{x}{p}) &,p^2\mid n\\
f(\frac{x}{p})\cdot f(p) &,p^2\nmid n
\end{cases}
$$

其中 $p$ 表示 $n$ 的最小质因子,总时间复杂度 $O(n+\sqrt n)$ 。

## 莫比乌斯反演扩展

结尾补一个不常用的莫比乌斯反演非卷积形式的公式
@@ -849,54 +893,6 @@ t\left(\frac{T}{i}\right)g\left(\left\lfloor\frac{n}{T}\right\rfloor\right)
\end{eqnarray}
$$

 **解法二** 

转化一下,可以将式子写成

$$
\begin{eqnarray}
&&\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijd\cdot[gcd(i,j)=1]\\
&=&\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum_{t\mid gcd(i,j)}\mu(t)\\
&=&\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ij\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}\mu(t)[t\mid gcd(i,j)]\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij[1\mid gcd(i,j)]\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij
\end{eqnarray}
$$

容易知道

$$
\sum_{i=1}^{n}\sum_{j=1}^{m}ij=\frac{n(n+1)}{2}\cdot \frac{m(m+1)}{2}
$$

设 $sum(n,m)=\sum_{i=1}^{n}\sum_{j=1}^{m}ij$ ,继续接着前面的往下推

$$
\begin{eqnarray}
&&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\sum_{i=1}^{\lfloor\frac{n}{td}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{td}\rfloor}ij\\
&=&\sum_{d=1}^{n}d\sum_{t=1}^{\lfloor\frac{n}{d}\rfloor}t^2 \mu(t)\cdot sum(\lfloor\frac{n}{td}\rfloor,\lfloor\frac{m}{td}\rfloor)\\
&=&\sum_{T=1}^{n}sum(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)\sum_{d\mid T}d\cdot (\frac{T}{d})^2\mu(\frac{T}{d})\\
&=&\sum_{T=1}^{n}sum(\lfloor\frac{n}{T}\rfloor,\lfloor\frac{m}{T}\rfloor)(T\sum_{d\mid T}d\cdot\mu(d))
\end{eqnarray}
$$

这时我们只要对每个 $T$ 预处理出 $T\sum_{d\mid T}d\cdot\mu(d)$ 的值就行了,考虑如何快速求解

设 $f(n)=\sum_{d\mid n}d\cdot\mu(d)$ 

实际上 $f$ 可以用线性筛筛出,具体的是

$$
f(n)=
\begin{cases}
1-n &,n\in primes \\
f(\frac{x}{p}) &,p^2\mid n\\
f(\frac{x}{p})\cdot f(p) &,p^2\nmid n
\end{cases}
$$

其中 $p$ 表示 $n$ 的最小质因子

总时间复杂度 $O(n+\sqrt n)$ 
## 参考文献

> 本文部分内容引用于 [algocode 算法博客](https://algocode.net) ,特别鸣谢!
 [algocode 算法博客](https://algocode.net)