在信息学奥赛中,有时会遇到一些定义域在正整数域下的函数,即数论函数。积性函数作为一类特殊的数论函数,经常成为我们讨论的对象。在这一类问题中,选手们往往需要先进行一些推导,并选择合适的方法整理计算后的式子,这时就需要一些搞笑高效的算法来帮助我们完成最后的计算。
常见的积性函数
-
除数函数 \(\sigma_{k}(n)=\sum_{d|n}d^k\)
-
\(\text{Euler}\) 函数 \(\varphi(n)=\sum_{i=1}^n[\gcd(i,n)=1]\)
-
\(\text{M\"{o}bius}\) 函数 \(\mu(n)=\begin{cases}1&n=1\\(-1)^k&n为k个不同质数之积\\0&\text{otherwise}\end{cases}\)
常见的完全积性函数:
Dirichlet 卷积
定义 \(*\) 运算表示:
\[(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})
\]
Dirichlet 卷积有以下性质:
证明是显然的,这里不放了。
常见的卷积有:
证明过程放在每个题里。
莫比乌斯函数
定义莫比乌斯函数 \(\mu(n)\)。设 \(n=\prod\limits_{i=1}^kp_i^{\alpha_i}\),有
\[\mu(n)=\begin{cases}
1 & n=1\\
0 & \exists i,\alpha_{i}\geq 2\\
(-1)^k & \text{otherwise}
\end{cases}
\]
可知这个函数是积性函数,于是可以线性筛求 \(\mu\)。代码如下:
void euler(int n)
{
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!v[i]) p[++pcnt] = i, mu[i] = -1;
for (int j = 1; j <= pcnt && i * p[j] <= n; j++)
{
v[i * p[j]] = 1;
if (i % p[j] == 0) break;
mu[i * p[j]] = -mu[i];
}
}
}
莫比乌斯反演
如果两个数论函数 \(f,g\) 满足:
\[f(n)=\sum_{d|n}g(d)
\]
则它们也同时满足:
\[g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})
\]
反之亦然,即 \(f=g*1\iff g=\mu*f\)。
\(\text{proof.}\)
左推右,考虑凑出 \(f*\mu\),所以对两边都卷上 \(\mu\),有
\[f*\mu=g*1*\mu
\]
于是只要证 \(1*\mu=\epsilon\) 就行了。这个引理十分重要,这里证一下。
考虑利用算贡献的方法,考虑每个因数会选出多少个质因数,考虑这个数量的贡献求和,来改写式子左边有,
\[\text{LHS}=\sum_{d|n}\mu(d)=\sum_{i=0}^k(-1)^i\begin{pmatrix} k\\ i\end{pmatrix}=(1-1)^n=\epsilon(n)=\text{RHS},\square
\]
于是有 \(f*\mu=g*\epsilon=g\),充分性得证。
必要性只需要把两边都卷上 \(1\) 就行了。\(\text{Q.E.D.}\)
在基础应用中,最常用的是证明过程中顺手证的引理,但是正牌莫反会有更多的用处。但我们先不急着去做题,莫比乌斯反演还有一种非卷积形式:
设 \(f,g\) 为数论函数,\(t\) 为完全积性函数且 \(t(1)=1\),有
\[f(n)=\sum_{k=1}^n t(k)g(\lfloor\frac{n}{k}\rfloor)\iff g(n)=\sum_{k=1}^nt(k)\mu(k)f(\lfloor\frac{n}{k}\rfloor)
\]
\(\text{proof.}\)
左推右,有
\[\sum_{k=1}^n\mu(k)t(k)f(\lfloor\frac{n}{k}\rfloor)=\sum_{k=1}^n\mu(k)t(k)\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}t(i)g(\lfloor\frac{n}{ki}\rfloor)
\]
枚举 \(ki\),有
\[\sum_{k=1}^n\mu(k)t(k)f(\lfloor\frac{n}{k}\rfloor)=\sum_{j=1}^ng(\lfloor\frac{n}{j}\rfloor)\sum_{i|j}t(i)t(\frac{j}{i})\mu(i)=\sum_{j=1}^ng(\lfloor\frac{n}{j}\rfloor)t(j)\sum_{i|j}\mu(i)
\]
由引理,得
\[\sum_{k=1}^n\mu(k)t(k)f(\lfloor\frac{n}{k}\rfloor) = \sum_{j=1}^ng(\lfloor\frac{n}{j}\rfloor)t(j)\epsilon(j)=g(n)t(1)=g(n)
\]
反之亦然。\(\text{Q.E.D.}\)
一些基础例题
1.GCD SUM
求
\[\sum_{i=1}^{n}\sum_{j=1}^n\gcd(i,j)
\]
\(\text{sol.}\)
先证引理:\(\varphi(n)=\sum_{d|n}\mu(d)\frac{n}{d}\)。
\[\phi(n)=\sum_{i=1}^n[\gcd(i,n)=1]=\sum_{i=1}^n\sum_{d|\gcd(i,n)}\mu(d)
\]
然后考虑 \(\mu(d)\) 的贡献,有
\[\varphi(n)=\sum_{d|n}\mu(d)\frac{n}{d}
\]
故引理得证。这个引理也很常用。
\[\text{Ans}=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^n[\gcd(i,j)=d]d
\\=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\epsilon(\gcd(i,j))
\\=\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{k|\gcd(i,j)}\mu(k)
\\=\sum_{d=1}^nd\sum_{k=1}^n\mu(k)\lfloor\frac{n}{dk}\rfloor^2
\\=\sum_{D=1}^n\lfloor\frac{n}{D}\rfloor^2\sum_{d|D}d\mu(\frac{D}{d})\\=\sum_{D=1}^n\lfloor\frac{n}{D}\rfloor^2\varphi(n)
\]
其中第一行到第二行我们把 \(d\) 提到前面去,改枚举 \(i,j\) 为 \(\frac{i}{d},\frac{j}{d}\),把 \([\gcd(i,j)=d]\) 转化为 \(\gcd(\frac{i}{d},\frac{j}{d})=1\),就可以利用莫反了。所以第二步到第三步就是生套莫反公式,第三步到第四步是考虑 \(\mu(k)\) 的贡献,然后再改求和顺序。这样线性筛 \(\varphi\),求前缀和,然后整除分块就可以 \(O(n)\) 做了,瓶颈是线性筛。
请格外注意过程中对和式的处理。
2.Crash的数字表格 / JZPTAB
求
\[\sum_{i=1}^n\sum_{j=1}^m\operatorname{lcm}(i,j)
\]
\(\text{sol.}\)
\[\text{Ans}=\sum_{i=1}^n\sum_{j=1}^m\operatorname{lcm}(i,j)=\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{\gcd(i,j)}
\]
然后利用经典算贡献套路把 \(d\) 提出来,枚举 \(i,j\) 改为枚举 \(di,dj\) 来枚举 \(\gcd(i,j)\),不妨设 \(n\leq m\),有
\[\text{Ans}=\sum_{d=1}^n d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]ij=\sum_{d=1}^n d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\epsilon(\gcd(i,j))ij
\]
由莫比乌斯反演公式,我们有 \(\sum_{d|n}\mu(d)=\epsilon(n)\),于是原式转化为
\[\sum_{d=1}^n \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{x|\gcd(i,j)}\mu(x)ij
\]
然后再利用枚举 \(\gcd\) 的套路,有
\[\text{Ans}=\sum_{d=1}^n d\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)\sum_{xi=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{xj=1}^{\lfloor\frac{m}{d}\rfloor}x^2ij=\sum_{d=1}^nd\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)x^2(\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}i)(\sum_{j=1}^{\lfloor\frac{n}{dx}\rfloor}j)
\]
记 \(s(x)=\sum_{i=1}^x i\),于是有
\[\text{Ans}=\sum_{d=1}^n\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)x^2s(\lfloor\frac{n}{dx}\rfloor)s(\lfloor\frac{m}{dx}\rfloor)
\]
把 \(s(\lfloor\frac{n}{dx}\rfloor)s(\lfloor\frac{m}{dx}\rfloor)\) 提前面,就有
\[\text{Ans}=\sum_{D=1}^ns(\lfloor\frac{n}{D}\rfloor)s(\lfloor\frac{m}{D}\rfloor)\sum_{db=D}db^2\mu(b)=\sum_{D=1}^ns(\lfloor\frac{n}{D}\rfloor)s(\lfloor\frac{m}{D}\rfloor)D\sum_{b|D}b\mu(b)
\]
然后预处理 \(b\mu(b)\) 的 Dirichlet 前缀和,然后整除分块就能做了。
3.约数个数和
设 \(d(x)\) 表示 \(x\) 的约数个数,求
\[\sum_{i=1}^n\sum_{j=1}^md(ij)
\]
\(\text{sol.}\)
先想着利用 \(d\) 的积性,把 \(d(ij)\) 转化为 \(\frac{d(i)d(j)}{d(\gcd(i,j))}\),发现推得
\[\text{Ans}=\sum_{i=1}^m\frac{1}{d(i)}\cdot(\sum_{j=1}^nd(j))\cdot(\sum_{j=1}^md(j))
\]
如果所求有取模,那直接预处理 \(sum_{i=1}^nd(i)\) 和 \(\sum_{i=1}^n\frac{1}{d(i)}\) 就可以做到 \(O(\sqrt{n})\) 了,但这个题没有取模的要求,考虑直接求 \(d(ij)\)。我们有引理:
\[d(xy)=\sum_{i|x}\sum_{j|y}[\gcd(i,j)=1]
\]
\(\text{proof.}\) 不会,抄的题解,但感觉很有用,记一下以后常看看。
然后莫反的过程就比较平凡了。
加强一下:[SDOI2018] 旧试题
求
\[\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk)
\]
\(\text{sol.}\)
还不会
杜教筛
设 \(f\) 为数论函数,要求
\[S(n)=\sum_{i=1}^nf(i)
\]
考虑构造一个数论函数 \(g\),我们有恒等式
\[\sum_{i=1}^n(f*g)(i)=\sum_{i=1}^ng(i)S(\lfloor\frac{n}{i}\rfloor)
\]
得到递归式
\[g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S(\lfloor\frac{n}{i}\rfloor)
\]
熟知 \(\lfloor\frac{n}{i}\rfloor\) 的取值为 \(O(\sqrt{n})\) 的,假如可以快速对 \((f*g)(i)\) 与 \(g(i)\) 的和,可以根据 \(\lfloor\frac{n}{i}\rfloor\) 的值进行数论分块,进行一遍求和的时间复杂度就是 \(O(\sqrt n)\),然后总的复杂度就是
\[\sum_{i=1}^{\lfloor\sqrt{n}\rfloor}O(\sqrt i)+\sum_{i=1}^{\lfloor\sqrt n\rfloor}O(\sqrt{\frac{n}{i}})
\]
(温情提示:前方积分预警)
后面一部分明显比前一部分大,所以考虑算后面的。
\[\sum_{i=1}^{\lfloor\sqrt n\rfloor}O(\sqrt{\frac{n}{i}})\approx O(\int_{0}^{\sqrt n}\sqrt{\frac{n}{x}}{\rm d}x)=O(n^{\frac{3}{4}})
\]
你可能说积分算大了,但你舍掉左边那一部分本来就算小了啊。
考虑能否优化这个过程,我们考虑预处理一部分,然后剩下部分直接调用算好的。我们设预处理了前 \(k\) 个 \(S\) 并假设预处理的复杂度为 \(O(n)\),那么复杂度就是
\[O(k)+O(\sum_{i=2}^{\lfloor\frac{n}{k}\rfloor}\sqrt{\frac{n}{i}})\approx O(k+\int_{0}^{\frac{n}{k}}\sqrt{\frac{n}{x}}{\rm d}x)=O(k+\frac{n}{\sqrt k})
\]
由均值不等式可知当 \(k\) 取 \(n^{\frac{2}{3}}\) 是复杂度最小,为 \(O(n^{\frac{2}{3}})\)。
例题:简单的数学题
求
\[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)
\]
\(\text{sol.}\)
利用莫反常见套路推出来
\[\text{Ans}=\sum_{T=1}^n(\sum_{i=1}^{\lfloor\frac{n}{T}\rfloor}i)^2T^2\varphi(T)
\]
然后考虑算 \(S(n)=\sum_{i=1}^ni^2\varphi(i)\)。我们套用杜教筛板子
\[g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S(\lfloor\frac{n}{i}\rfloor)
\]
我们想到 \(\varphi\) 的常见卷积
\[\varphi*1=\text{Id}
\]
于是令 \(g(x)=x^2\),有
\[(g*f)(i)=\sum_{d|n}d^2\varphi(d)\frac{i^2}{d^2}=i^2\sum_{d|n}\varphi(d)=i^3
\]
然后就可以快速地进行杜教筛。