Loading docs/math/mobius.md +309 −313 Original line number Diff line number Diff line Loading @@ -8,9 +8,7 @@ author: hydingsy, hyp1231 * * * ## 数论分块与整除相 先补一下数学小 trick ## 前置知识 ### 引理 1 Loading Loading @@ -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; Loading Loading @@ -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) Loading @@ -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$ Loading Loading @@ -320,10 +317,9 @@ $$ 很显然,式子可以数论分块求解(注意:过程中默认 $n\leqslant m$ )。 **时间复杂度** : $\Theta(N+T\sqrt{n})$ **代码** : **时间复杂度 $\Theta(N+T\sqrt{n})$ ** ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -420,8 +416,7 @@ $$ **时间复杂度** : $\Theta(n\log n)$ **代码** : ??? note "代码实现" ```cpp #include <cstdio> const int N = 1000000; Loading Loading @@ -529,8 +524,7 @@ $$ 时间复杂度: $\Theta(n+m)$ (两次数论分块) 代码: ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -642,6 +636,7 @@ $$ 那么 $O(n)$ 预处理 $\mu,d$ 的前缀和, $O(\sqrt{n})$ 分块处理询问,总复杂度 $O(n\sqrt{n})$ . ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -734,6 +729,7 @@ $$ 分块递归求解即可,复杂度 $O(n^{\frac{2}{3}})$ . ??? note "代码实现" ```cpp #include <cmath> #include <cstdio> Loading Loading @@ -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)$ 。 ## 莫比乌斯反演扩展 结尾补一个不常用的莫比乌斯反演非卷积形式的公式 Loading Loading @@ -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) Loading
docs/math/mobius.md +309 −313 Original line number Diff line number Diff line Loading @@ -8,9 +8,7 @@ author: hydingsy, hyp1231 * * * ## 数论分块与整除相 先补一下数学小 trick ## 前置知识 ### 引理 1 Loading Loading @@ -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; Loading Loading @@ -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) Loading @@ -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$ Loading Loading @@ -320,10 +317,9 @@ $$ 很显然,式子可以数论分块求解(注意:过程中默认 $n\leqslant m$ )。 **时间复杂度** : $\Theta(N+T\sqrt{n})$ **代码** : **时间复杂度 $\Theta(N+T\sqrt{n})$ ** ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -420,8 +416,7 @@ $$ **时间复杂度** : $\Theta(n\log n)$ **代码** : ??? note "代码实现" ```cpp #include <cstdio> const int N = 1000000; Loading Loading @@ -529,8 +524,7 @@ $$ 时间复杂度: $\Theta(n+m)$ (两次数论分块) 代码: ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -642,6 +636,7 @@ $$ 那么 $O(n)$ 预处理 $\mu,d$ 的前缀和, $O(\sqrt{n})$ 分块处理询问,总复杂度 $O(n\sqrt{n})$ . ??? note "代码实现" ```cpp #include <algorithm> #include <cstdio> Loading Loading @@ -734,6 +729,7 @@ $$ 分块递归求解即可,复杂度 $O(n^{\frac{2}{3}})$ . ??? note "代码实现" ```cpp #include <cmath> #include <cstdio> Loading Loading @@ -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)$ 。 ## 莫比乌斯反演扩展 结尾补一个不常用的莫比乌斯反演非卷积形式的公式 Loading Loading @@ -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)