积性函数

在信息学奥赛中,有时会遇到一些定义域在正整数域下的函数,即数论函数。积性函数作为一类特殊的数论函数,经常成为我们讨论的对象。在这一类问题中,选手们往往需要先进行一些推导,并选择合适的方法整理计算后的式子,这时就需要一些搞笑高效的算法来帮助我们完成最后的计算。

常见的积性函数

  • 除数函数 \(\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}\)

常见的完全积性函数:

  • 幂函数 \(\text{Id}_k(n)=n^k\)\(\text{Id}_1\) 简记为 \(\text{Id}\)

  • 单位函数 \(\epsilon(n)=[n=1]\)

Dirichlet 卷积

定义 \(*\) 运算表示:

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

Dirichlet 卷积有以下性质:

  • 交换律:\(f*g=g*f\)

  • 结合率:\((f*g)*h=f*(g*h)\)

  • 分配率:\(f*(g+h)=f*g+f*h\)

  • 单位元:\(f*\epsilon=f\),其中 \(\epsilon(n)=[n=1]\)

  • \(f,g\) 都是积性函数,则 \(f*g\) 也是积性函数

证明是显然的,这里不放了。

常见的卷积有:

  • \(\mu * 1 = \epsilon\)

  • \(\varphi * \text{Id}=1\)

  • \(\varphi * 1 = \text{Id}\)

证明过程放在每个题里。

莫比乌斯函数

定义莫比乌斯函数 \(\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 \]

然后就可以快速地进行杜教筛。

posted @ 2025-02-11 19:04  lhc0707  阅读(25)  评论(0)    收藏  举报