Number Theory(4)

11 莫比乌斯函数

尝试按照《具体数学》的顺序引入莫比乌斯反演。


11.1 引入

莫比乌斯函数 \(\mu(m)\) 是根据 19 世纪的数学家奥古斯特·莫比乌斯命名的,他还发现了著名的莫比乌斯带,\(\mu(m)\) 对所有整数 \(m \ge 1\) 由等式

\[\sum_{d \mid m} \mu(d) = [m=1] \]

来定义。

这个式子实际上是一个递归式,左边的 \(\mu(m)\) 和某些满足 \(d \lt m\)\(\mu(d)\) 的值组成的和式。我们有相继带入前面 \(m\),从而得到前面的值:\(1,-1,-1,0,-1,1,-1,0,0,1,-1,0,\cdots\)

在 1857 年,Richard Dedekind 和 Joseph Liouville 注意到了如下重要的 “反演原理”。

\[g(m) = \sum_{d \mid m} f(d) \Longleftrightarrow f(m) = \sum_{d \mid m} \mu(d) g(\frac m d) \]

这就是我们熟知的 莫比乌斯反演


发现这个东西的证明是容易的:如果 \(g(m) = \sum_{d \mid m} f(d)\),那么

\[\begin{aligned} \sum_{d \mid m} \mu(d) g(\frac m d) & = \sum_{d \mid m} \mu (\frac m d) g(d) \\ & = \sum_{d \mid m} \mu(\frac m d) \sum_{k \mid d} f(k) \\ & = \sum_{k \mid m} \sum_{d \mid \frac m k} \mu(\frac m {kd}) f(k) \\ & = \sum_{k \mid m} \sum_{d \mid \frac m k} \mu(d) f(k) \\ & = \sum_{k \mid m} \left[ \frac m k =1 \right] f(k) \\ & = f(m) \end{aligned} \]

反之,如果 \(f(m) = \sum_{d \mid m} \mu(d) g(\frac m d)\),则

\[\begin{aligned} \sum_{d \mid m} f(d) & = \sum_{d \mid m} \sum_{k \mid d} \mu(k) g(\frac d k) \\ & = \sum_{d \mid m} \sum_{k \mid d} \mu(\frac d k) g(k) \\ & = \sum_{k \mid m} \sum_{d \mid {\frac m k}} \mu(d) g(k) \\ & = \sum_{k \mid m} \left[ \frac m k =1 \right] g(k) \\ & = g(m) \end{aligned} \]

于是我们在这里就证明了 莫比乌斯反演

而莫比乌斯反演还可以被表示成

\[g = f * 1 \Longleftrightarrow f = g * \mu \]


现在回到最开始的那个式子,发现其实就是 \(\mu * 1 = \epsilon\),由于我们之前证明的 积性函数的逆元也是积性函数,可以知道 \(\mu\) 必是积性函数。这样一来,只要我们计算出 \(\mu(p^k)\) 就能算出 \(\mu(m)\)

\(m = p^k\) 时,根据最初的式子,我们知道对于所有 \(k \ge 1\),都有

\[\mu(1) + \mu(p) + \mu(p^2) + \cdots + \mu(p^k) =0 \]

由此推出

\[\mu(p) = -1 ; \quad \mu(p^k) =0,k \gt 1 \]

于是,我们就推出了 \(\mu\) 的定义式

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


如果我们把之前的欧拉反演视作 \(\varphi (m)\) 的递归式,就能应用莫比乌斯反演得到

\[\varphi (m) = \sum_{d \mid m} \mu(d) \frac m d \]

也就是 \(\mu * \text{id} = \varphi\),也对狄利克雷卷积逆元有了另一个方面的解释。


接下来我们尝试用容斥的角度来理解莫比乌斯函数。

\(g(n) = \sum_{n \mid d} f(d)\),即 \(g(n)\)\(f\) 在所有 \(n\) 的倍数处的取值和。现在已知 \(g\),要求 \(f(1)\)。则 \(f(1)\) 等于 \(f\)\(1\) 的倍数处的取值和,减去在质数处的取值和,但是多减去了在两个不同质数乘积处的取值和,一次要加上这些值,但是多加了在三个不同质数乘积处的取值和,以此类推。因此,若 \(n\)\(k\) 个不同质数的乘积,则 \(f(1)\) 会收到 \(g(n)\) 系数为 \((-1)^k\) 的贡献,如下图。

image

就是对 \(\mathbb N\) 作容斥,得到贡献系数 \(\mu\)


11.2 线性筛莫比乌斯函数

根据定义是,线性筛莫比乌斯函数是非常容易的。

  mu[1]=1;
  for(int i=2;i<=maxn;i++){
  	if(!vis[i]) p[++cnt]=i,mu[i]=-1;
  	for(int j=1;j<=cnt&&i*p[j]<=maxn;j++){
  	  vis[i*p[j]]=true;
	  if(i%p[j]==0) break;
	  mu[i*p[j]]=-mu[i];	
	}
  }

11.3 常见技巧

对于 莫比乌斯反演,我们常常用式子

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

它把 \(\gcd(i,j)\) 带入了 \(n\),还将 \(i,j\) 互质的条件转化为枚举 \(\gcd(i,j)\) 的约数 \(d\),然后对 \(\mu(d)\) 求和。在 \(i,j\) 同样需要枚举的时候,可以先枚举 \(d\) 并计算合法的 \((i,j)\) 对数,这样 \(i,j\) 合法当且仅当 \(d \mid i,d \mid j\),就把 \(i,j\) 独立开了。

于是我们就可以这样解决下面的式子:

\[\begin{aligned} \sum_{i=1}^n \sum_{j=1}^m \left[ \gcd(i,j) =1 \right] & = \sum_{i=1}^n \sum_{j=1}^m \sum_{d \mid \gcd(i,j)} \mu(d) \\ & = \sum_{d =1}^{\min(n,m)} \mu(d) \sum_{i=1}^n \sum_{j=1}^m \left[ d \mid i \land d \mid j \right] \\ & = \sum_{d=1}^{min(n,m)} \mu(d) \left \lfloor \frac n d \right \rfloor \left \lfloor \frac m d \right \rfloor \end{aligned} \]

相当于对最大公约数为 \(d\) 的倍数进行了容斥:加上最大公约数为 \(1\) 的倍数的对数,减去最大公约数为 \(p_i\) 的倍数的对数,加上最大公约数为 \(p_ip_j(i \neq j)\) 的倍数的对数,以此类推。得到每个 \(d\) 的贡献系数就是莫比乌斯函数。

而这个式子是非常容易用整除分块完成。


$$ d(ij) = \sum_{x \mid i} \sum_{y \mid j} \left [ x \bot y \right] $$ 考虑单个质因子 $p$,再用中国剩余定理和并。设 $a = v_p(i)$ 即 $i$ 中含有质因子 $p$ 的数量,$b = v_p(j)$,则 $v_p(ij)= a+b$。对于 $ij$ 的约数 $d$,若 $v_p(d) \le a$,则令其对应 $v_p(x) = v_p(d),v_p(y)=0$,即所有都算在 $x$ 上面;若 $v_p(d) \gt a$,则令其对应 $v_p(x)=0,v_p(y) = v_p(d) -a$。容易发现这样会形成双射,因此可证得这一结论。

11.4 例题

接下来,我们来将一些例题,由于比较多,所以单独提出来了。部分例题会用到上面的常见技巧。

前面的一些例题中有些写得比较简略,有些可能是👻乐团中的子问题,如果看不懂可以在那道题题解中找一下,或者直接问我。


P2522 [HAOI2011] Problem b

对于给出的 \(n\) 个询问,每次求有多少个数对 \((x,y)\),满足 \(a \le x \le b\)\(c \le y \le d\),且 \(\gcd(x,y) = k\)\(\gcd(x,y)\) 函数为 \(x\)\(y\) 的最大公约数。

\(1 \le n,k \le 5 \times 10^4\)\(1 \le a \le b \le 5 \times 10^4\)\(1 \le c \le d \le 5 \times 10^4\)

首先可以对式子做一个二维差分,转换成求下界为 \(1\) 的式子

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

我们把 \(i,j\)\(\div k\) 就可以得到

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

这就是一个经典的莫反式子,直接作就可以得到

\[\sum_{d=1}^{\min\left( \frac n k,\frac m k \right)} \mu(d) \left \lfloor \frac n {kd} \right \rfloor \left \lfloor \frac m {kd} \right \rfloor \]

于是就可以用整除分块在 \(\mathcal O(n + T \sqrt n)\) 时间内完成。代码


子问题:P3455 [POI2007] ZAP-Queries


P2257 YY的GCD

给定 \(N, M\),求 \(1 \leq x \leq N\)\(1 \leq y \leq M\)\(\gcd(x, y)\) 为质数的 \((x, y)\) 有多少对。

\(T = 10^4\)\(N, M \leq 10^7\)

问题就是求

\[\sum_{i=1}^n \sum_{j=1}^m \left[ \gcd(i,j) = \mathbb P \right] \]

我们用莫反相关知识对其进行推导可以得到

\[\begin{aligned} & = \sum_{p \in \mathbb P} \sum_{i=1}^n \sum_{j=1}^m \left[ \gcd(i,j) = p \right] \\ & = \sum_{p \in \mathbb P} \sum_{i=1}^{\left \lfloor \frac n p \right \rfloor} \sum_{j=1}^{\left \lfloor \frac m p\right \rfloor} \left [ \gcd(i,j) = 1\right] \\ & = \sum_{p \in \mathbb P} \sum_{d=1}^{\min(\left \lfloor \frac n p\right \rfloor,\left \lfloor \frac m p \right \rfloor)} \mu(d) \left \lfloor \frac n {pd} \right \rfloor \left \lfloor \frac m {pd} \right \rfloor \end{aligned} \]

于是我们令 \(T = pd\),那么可以得到

\[\sum_{T=1}^{\min(n,m)} \left \lfloor \frac n T \right \rfloor \left \lfloor \frac m T \right \rfloor \sum_{p \mid T \land p \in \mathbb P} \mu(\frac T p) \]

前面可以直接用整除分块完成,而后面的 \(\sum_{p \mid T \land p \in \mathbb P} \mu(\frac T p)\) 乍一眼是不好完成的。

但细想发现这是可以和莫比乌斯函数一起在线性筛中解决的,所以我们就可以直接预处理出其前缀和,从而做到时间复杂度 \(\mathcal O(n + T \sqrt n)\)代码


双倍经验:P2568 GCD


SP5971 LCMSUM - LCM Sum

\(T\) 次询问,每次询问给出 \(n\),求

\[\sum_{i=1}^n \text{lcm}(i,n) \]

\(1 \le T \le 3 \times 10^5,1 \le n \le 10^6\)

首先我们考虑把 \(\text{lcm}\) 转化成 \(\gcd\),那么

\[\begin{aligned} & \sum_{i=1}^n \text{lcm}(i,n) \\ = & \sum_{i=1}^n \frac {in} {\gcd(i,n)} \\ = & n \sum_{i=1}^n \frac i {\gcd(i,n)} \\ = & n \sum_{d \mid n} \frac 1 d \sum_{i=1}^n i \left[ \gcd(i,n) = d \right] \\ = & n \sum_{d \mid n} \frac 1 d \sum_{i=1}^{\frac n d} id \left[ \gcd(i,\frac n d)=1 \right] \\ = & n \sum_{d \mid n} \sum_{i=1}^{\frac n d} i \left[ \gcd(i,\frac n d) =1 \right] \end{aligned} \]

我们设

\[F(n) = \sum_{i=1}^n i \left[ \gcd(i,n) =1 \right] \]

只要我们求出这个,就可以计算上面的式子了。


首先我们可以暴力用莫反计算,也就是

\[\begin{aligned} F(n) & = \sum_{i=1}^n i \sum_{d \mid i \land d \mid n} \mu(d) \\ & = \sum_{d \mid n} \mu(d) d \frac {\frac n d \left( \frac n d +1 \right)} 2 \\ & = \frac n 2 \sum_{d \mid n} \mu(d) \left( \frac n d +1 \right) \end{aligned} \]

我们发现后面可以被拆成 \(\mu * (\text{id} + 1) = \mu * \text{id} + \mu * 1 = \varphi + \epsilon\),于是我们就可以得到

\[\frac {n(\varphi(n) + \epsilon(n))} 2 \]


还有另外一种方法就是对与 \(n\) 互质的数进行分析,如果 \(x \bot n\) 则一定有 \((n-x) \bot n\),那么我们把它两两配对,就有 \(\frac {n \varphi(n)} 2\)

而显然 \(F(1)= 1\)


现在原式就变成了

\[\begin{aligned} & n \sum_{d \mid n} \frac {d (\varphi(d) + \epsilon(d))} 2 \\ = & \frac n 2 \left( 1 + \sum_{d\mid n} d \varphi(d) \right) \end{aligned} \]

而这里的 \(\sum_{d \mid n}d \varphi(d) = 1 * (\text{id} \times \varphi)\) 是可以用线性筛筛出来的,于是总时间复杂度 \(\mathcal O(T+n)\)代码


P4318 完全平方数

\(n\) 次询问,每次询问给出一个 \(k\),查询第 \(k\) 个不是完全平方数的正整数倍数的数。

\(1 \le k \le 10^9,1 \le n \le 50\)

\(f(n)\) 表示 \(\le n\) 的非完全平方数倍数的数,那么我们最后只需要二分答案即可。

怎么求 \(f(n)\) 呢?

发现可以先去掉 \(4,9,\cdots\) 的倍数,而接下来就要加上 \((p_1p_2)^2\) 的倍数,这不难让我们想到莫比乌斯函数。

相当于做容斥,那么我们就有

\[f(n)= \sum_{i=1} \mu(i) \left \lfloor \frac n {i^2} \right \rfloor \]

直接计算,时间复杂度 \(\mathcal O(\sqrt n \log n)\)代码


P1829 [国家集训队] Crash的数字表格 / JZPTAB

给定 \(n,m\),求

\[\sum_{i=1}^n \sum_{j=1}^m \text{lcm}(i,j) \]

\(1 \le n,m \le 10^7\)

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \sum_{i=1}^n \sum_{j=1}^m \text{lcm}(i,j) \\ = & \sum_{i=1}^n \sum_{j=1}^m \frac {ij} {\gcd(i,j)} \\ = & \sum_{d=1}^{\min} d \sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} [\gcd(i,j) = 1]ij \end{aligned} \]

后面的式子就和 SP5971 一样了。直接做就是线性的。代码


P3704 [SDOI2017] 数字表格

Doris 刚刚学习了 fibonacci 数列。用 \(f_i\) 表示数列的第 \(i\) 项,那么

\[f_0=0,f_1=1 \]

\[f_n=f_{n-1}+f_{n-2},n\geq 2 \]

Doris 用老师的超级计算机生成了一个 \(n\times m\) 的表格,

\(i\) 行第 \(j\) 列的格子中的数是 \(f_{\gcd(i,j)}\),其中 \(\gcd(i,j)\) 表示 \(i,j\) 的最大公约数。

Doris 的表格中共有 \(n\times m\) 个数,她想知道这些数的乘积是多少。

答案对 \(10^9+7\) 取模。

\(1 \leq T\leq 10^3\)\(1\leq n,m\leq 10^6\)

稍微推一下式子就是

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \prod_{i=1}^n \prod_{j=1}^m f_{\gcd(i,j)} \\ = & \prod_{d=1}^{\min(n,m)} {f_d}^{\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j) = d]} \\ = & \prod_{d=1}^{\min(n,m)} {f_d}^{\sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} [\gcd(i,j) = 1]} \\ = & \prod_{d=1}^{\min(n,m)} {f_d}^{\sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} \sum_{t \mid i,t \mid j} \mu(t)} \\ = & \prod_{d=1}^{\min(n,m)} {f_d}^{\sum_{t=1}^{\min\left(\lf \frac n d \rf,\lf \frac m d \rf \right)} \mu(t) \lf \frac n {td} \rf \lf \frac m {td} \rf } \\ = & \prod_{T=1}^{\min(n,m)} \left( \prod_{d \mid T} {f_d}^{\mu \left( \frac T d \right)} \right)^{\lf \frac n T \rf \lf \frac m T \rf} \end{aligned} \]

预处理一下括号内的东西,整除分块之后可以做到单次 \(\mathcal O(\sqrt n)\)


P5221 Product

给定 \(n\),求

\[\prod_{i=1}^n \prod_{j=1}^n \frac {\text{lcm}(i,j)} {\gcd(i,j)} \pmod {104857601} \]

\(1 \le n \le 10^6\),时限 \(200ms\)

有些人喜欢在写完👻之后来写这道题。


话不多说,直接暴力推一下式子就是了。

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \prod_{i=1}^n \prod_{j=1}^n \frac {\text{lcm}(i,j)} {\gcd(i,j)} \\ = & \prod_{i=1}^n \prod_{j=1}^n \frac {ij} {\gcd(i,j)^2} \\ = & \left( \prod_{i=1}^n i \right)^{2n} \frac 1 {\left( \prod_{i=1}^n \prod_{j=1}^m \gcd(i,j) \right)^2} \end{aligned} \]

前面的直接阶乘处理一下,后面的我们枚举 gcd 就可以得到

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \prod_{i=1}^n \prod_{j=1}^m \gcd(i,j) \\ = & \prod_{d=1}^n d^{\sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac n d \rf} [\gcd(i,j) = 1]} \\ = & \prod_{d=1}^n d^{\sum_{t=1}^{\lf \frac n d \rf} \mu(t) \lf \frac n dt \rf^2} \end{aligned} \]

于是两次整除分块就可以线性完成了,代码相当好些。代码


P3911 最小公倍数之和

对于 \(a_1,a_2,\cdots,a_n\),求

\[\sum_{i=1}^n \sum_{j=1}^n \text{lcm}(a_i,a_j) \]

\(1 \le n,a_i \le 5 \times 10^4\)

给定具体的数是不好处理的,所以我们考虑先令 \(c_i = \sum_{j=1}^n \left[a_j =i \right]\),即 \(i\) 的出现次数,而 \(V\) 为值域。

那么

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \sum_{i=1}^n \sum_{j=1}^n \text{lcm}(a_i,a_j) \\ = & \sum_{i=1}^n \sum_{j=1}^n \frac {a_ia_j} {\gcd(a_i,a_j)} \\ = & \sum_{d=1}^V \sum_{i=1}^n \sum_{j=1}^n \frac {a_ia_j} d [\gcd(a_i,a_j) = d] \\ = & \sum_{d=1}^V \sum_{i=1}^V \sum_{j=1}^V \frac {ijc_ic_j} d [\gcd(i,j) = d] \\ = & \sum_{d=1}^V d \sum_{i=1}^{\lf \frac V d \rf} \sum_{j=1}^{\lf \frac V d \rf} ijc_{id}c_{jd} [\gcd(i,j)=1] \\ = & \sum_{d=1}^V d \sum_{i=1}^{\lf \frac V d \rf} \sum_{j=1}^{\lf \frac V d \rf} ijc_{id}c_{jd} \sum_{k \mid i \land k \mid j} \mu(k) \\ = & \sum_{d=1}^V d \sum_{k=1}^{\lf \frac V d \rf} \mu(k) k^2 \sum_{i=1}^{\lf \frac V {kd} \rf} \sum_{j=1}^{\lf \frac V {kd} \rf} ijc_{ikd}c_{jkd} \end{aligned} \]

我们令 \(T = kd\) 就可以得到

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} = & \sum_{T=1}^V \sum_{d \mid T} \mu(d) d^2 \frac T d \sum_{i=1}^{\lf \frac V T \rf} \sum_{j=1}^{\lf \frac V T \rf} ijc_{iT}c_{jT} \\ = & \sum_{T=1}^V T \left( \sum_{d \mid T} \mu(d) d \right) \left( \sum_{i=1}^{\lf \frac V T \rf} i c_{iT} \right)^2 \end{aligned} \]

于是只要我们令 \(f(T) =\sum_{d \mid T} \mu(d) d,g(T) = \sum_{i=1}^{\left \lfloor \frac V T \right \rfloor} i c_{iT}\),原式就变成

\[\sum_{T=1}^V T f(T) g^2(T) \]

其中 \(f\) 可以在线性筛中处理出来,而 \(g\) 可以采取暴力枚举倍数和狄利克雷后缀和做到 \(\mathcal O(V \ln V)\)\(\mathcal O(V \ln \ln V)\)

这样就做完了,查询时可以直接线性完成。代码。(暴力枚举计算 \(g\)


双倍经验:AGC038C LCMs


CF1285F Classical?

\(n\) 个整数 \(a_1,a_2,\cdots,a_n\),求 \(\max_{1 \le i \lt j \le n} \left( \text{lcm}(a_i,a_j) \right)\)

\(2 \le n \le 10^5,1\ \le a_i \le 10^5\)

求完了和,我们现在来求 \(\max\)


考虑加上一个 \(\gcd(a_i,a_j) = 1\) 的条件。于是我们从大到小枚举每一个数,如果当前加入一个数 \(x\),存在一个 \(\gt x\) 的数 \(y\) 满足 \(\gcd(x,y)=1\),那么所有 \(x \le z \le y\) 中间的所有 \(z\) 都是没有用的,因为与他们互质的数比 \(x\) 小了。

容易发现这是可以用单调栈直接维护的,那么我们如何计算出是否有与 \(x\) 互质的数呢?

通过上面有关 \(\mu\) 的容斥原理,我们设 \(cnt_d\) 表示 \(d\) 的倍数的出现次数,那么答案就是

\[\sum_{d \mid x} \mu(d) cnt_d \]

只要这个值不为 \(0\),我们就可以一直弹栈找到与它互质的那个数。

时间复杂度 \(\mathcal O(\sum_{i=1}^n d(i))\),也就是 \(\mathcal O(V \log V)\)


而对于 \(\gcd \neq 1\)\(\text{lcm}\) 如何计算?

我们可以枚举每一个 \(\gcd\) 都这样做一次,这样的时间复杂度是 \(\mathcal O(V \log^2 V)\) 的,但是它并不优秀。

发现如果 \(\gcd(x,y) \neq 1\),那么对于 \(a \mid x,b \mid y\),一定存在一组 \((a,b)\) 满足 \(\gcd(a,b)= 1,\text{lcm} (a,b) = \text{lcm}(x,y)\),于是我们把所有 \(a_i\) 的因数都加到集合中,一起跑上面的算法,时间复杂度还是 \(\mathcal O(V \log V)\)代码


P3327 [SDOI2015] 约数个数和

给定 \(n,m\),求

\[\sum_{i=1}^n \sum_{j=1}^m d(ij) \]

\(1 \le T,n,m \le 50000\)

在常见技巧中,我们列出了整个式子的转化。

于是式子就是

\[\begin{aligned} & \sum_{i=1}^n \sum_{j=1}^m d(ij) \\ = & \sum_{i=1}^n \sum_{j=1}^m \sum_{x \bot i} \sum_{y \bot j} \left[ x \bot y\right] \\ = & \sum_{i=1}^n \sum_{j=1}^m \sum_{x \bot i} \sum_{y \bot j} \left[ \gcd(x,y)=1 \right] \end{aligned} \]

于是直接对这个式子莫反就可以得到

\[\sum_{d=1}^{\min(n,m)} \mu(d) \sum_{x=1}^{\left \lfloor \frac n d \right \rfloor} \sum_{y=1}^{\left \lfloor \frac m d \right \rfloor} \left \lfloor \frac n {xd} \right \rfloor \left \lfloor \frac m {yd} \right \rfloor \]

\(g(n) = \sum_{i=1}^n \left \lfloor \frac n i \right \rfloor\),这时可以用整除分块预处理出来的。

于是式子就是

\[\sum_{d=1}^{\min(n,m)} \mu(d) g(\left \lfloor \frac n d\right \rfloor) g(\left \lfloor \frac m d \right \rfloor) \]

直接整除分块可以做到时间复杂度 \(\mathcal O(n \sqrt n + T \sqrt n)\)代码


P4619 [SDOI2018] 旧试题

给定 \(A,B,C\)

\[\left( \sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \right) \bmod \left(10^9+7 \right) \]

\(1 \le A,B,C \le 10^5,1 \le T \le 10\)

更为厉害的约数个数和。


多了一个变量,但是按照之前的转化方式是类似的

\[d(ijk) = \sum_{u \mid i} \sum_{v \mid j} \sum_{w \mid k} [\gcd(u,v) = 1] [\gcd(v,w) = 1] [\gcd(u,w) = 1] \]

那么我们就可以对这个东西进行莫反了

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \\ = & \sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C \sum_{u \mid i} \sum_{v \mid j} \sum_{w \mid k} [\gcd(u,v) = 1] [\gcd(v,w) = 1] [\gcd(u,w) = 1] \\ = & \sum_{u=1}^A \sum_{i=1}^{\lf \frac A u \rf} \sum_{v=1}^B \sum_{j=1}^{\lf \frac B v \rf} \sum_{w=1}^C \sum_{k=1}^{\lf \frac C w \rf} [\gcd(u,v) = 1] [\gcd(v,w) = 1] [\gcd(u,w) = 1] \\ = & \sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C \lf \frac A i \rf \lf \frac B j \rf \lf \frac C k \rf \sum_{u \mid i \land u \mid j} \mu(u) \sum_{v \mid i \land v \mid k} \mu(v) \sum_{w \mid j \land w \mid k} \mu(w) \\ = & \sum_{u=1}^{\min(A,B)} \sum_{v=1}^{\min(A,C)} \sum_{w=1}^{\min(B,C)} \mu(u) \mu(v) \mu(w) \sum_{\text{lcm} (u,v) \mid i} \lf \frac A i \rf \sum_{\text{lcm}(u,w) \mid j} \lf \frac B j \rf \sum_{\text{lcm} (v,w) \mid k} \lf \frac C k \rf \end{aligned} \]

我们可以令 \(fa(i) = \sum_{i \mid j} \left \lfloor \frac A j \right \rfloor,fb(i) = \sum_{i \mid j} \left \lfloor \frac B j \right \rfloor,fc(i) = \sum_{i \mid j} \left \lfloor \frac C j \right \rfloor\),那么这是可以直接枚举倍数在 \(\mathcal O(n \ln n)\) 的时间复杂度内预处理出来的,计算时就变成了

\[\sum_{u=1}^{\min(A,B)} \sum_{v=1}^{\min(A,C)} \sum_{w=1}^{\min(B,C)} \mu(u) \mu(v) \mu(w) fa(\text{lcm} (u,v)) fb(\text{lcm}(u,w)) fc(\text{lcm} (v,w)) \]

然后你发现这还是 \(O(n^3)\) 的,莫反根本没有用!


真的没有用吗?这个式子在哪些地方是有值的呢?

容易发现我们首先需要保证 \(\mu(u),\mu(v),\mu(w)\) 都不是 \(0\),并且 \(\text{lcm} (u,v) \le A,\text{lcm}(u,w) \le B,\text{lcm} (v,w) \le C\)

那么也就是对于任意的两个点,它们可以成为一组就意味着 \(\mu(u) \neq 0,\mu(v) \neq 0,\text{lcm} (u,v) \le \max(A,B,C)\),然后我们尝试把这样的二元组建立一条边,边权为 \(\text{lcm} (u,v)\)


这个做法看起来根本不可行,并且直接这样建边是 \(\mathcal O(n^2)\) 的。

但是细想一下,这个条件是相当严的,要求 \(u,v,\gcd(u,v)\) 都不能出现平方因子。于是我们可以先枚举 \(\gcd(u,v)\),再分别枚举 \(\frac u {\gcd(u,v)}\)\(\frac v {\gcd(u,v)}\) 在枚举的过程中判断 \(\mu(\gcd),\mu(u),\mu(v) \neq 0\)\(\frac u {\gcd(u,v)} \bot \frac v {\gcd(u,v)}\)

每一次我们枚举了质数的子集,而 \(10^5\) 内只会出现 \(6\) 个不同的质数,所以这样枚举下来是 \(\mathcal O(m)\) 的!

下面给出这一部分的代码实现。

  for(int g=1;g<=mx;g++)
    for(int i=1;i*g<=mx;i++)
	  if(mu[i*g])
	    for(int j=i+1;1ll*i*j*g<=mx;j++)
		  if(mu[j*g]&&gcd(i,j)==1){
            int u=i*g,v=j*g,w=i*j*g;
			/*...*/
		  }

进而,我们发现这样的点对并不多,实测发现只有 760741 个!赢麻了!


那么现在成了怎么找三元环,可以尝试阅读 这篇博客

也就是我们将无向边定向,每一条边从度数大的点连向度数小的,然后这样去枚举的时间复杂度就是 \(\mathcal O(m \sqrt m)\),具体可以看上面的链接。

于是我们就做完了!直接枚举就可以了。

  for(int x=1;x<=mx;x++){
    for(auto i:G[x]) vis[i.fi]=i.se;
    for(auto i:G[x]){
	  int y=i.fi,wxy=i.se;
      for(auto j:G[y]){
		if(!vis[j.fi]) continue;
        int z=j.fi,wyz=j.se,wxz=vis[z],val=mu[x]*mu[y]*mu[z];
		/*...*/
	  }
	}
	for(auto i:G[x]) vis[i.fi]=0;
  }

这样就可以做到 \(O(n \ln n+m \ln m)\),完全胜利!代码

存在把上面式子化成 \(\mathcal O(n^2 \log n)\) 的做法,简单来说就是只提出 \(u\),对后面枚举的 \(i,j\) 都除以 \(u\) 去按照之前我们做过的套路完成,但此做法对后面的推导并无意义,具体可以去看第三篇题解。


三倍经验:CF236B Easy Number ChallengeCF235E Number Challenge


P5518 [MtOI2019] 👻乐团 / 莫比乌斯反演基础练习题

东风谷 早苗(Kochiya Sanae)非常喜欢幽灵乐团的演奏,她想对她们的演奏评分。

因为幽灵乐团有 \(3\) 个人,所以我们可以用 \(3\) 个正整数 \(A,B,C\) 来表示出乐团演奏的分数,她们的演奏分数可以表示为

\[\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^{C}\left(\frac{\text{lcm}(i,j)}{\gcd(i,k)}\right)^{f(type)} \]

因为音乐在不同的部分会有不同的听觉感受,所以 \(type\) 会在 \(\{0,1,2\}\) 中发生变化,其中:

\[\begin{aligned} f(0)&=1 \cr f(1)&=i \times j \times k \cr f(2)&=\gcd(i,j,k) \end{aligned}\]

因为乐团的歌实在太好听了,导致分数特别高,所以她们的分数要对给定的正整数 \(p\) 取模。

因为有很多歌曲要演奏,所以早苗给出了 \(T\) 组询问。

\[1\leq A,B,C\leq 10^5 \ \ \ \ 10^7 \leq p \leq 1.05\times 10^9\ \ \ \ p\in \{ prime\} \ \ \ \ T =70 \]

再来一个三重循环的题。

众所周知,cdqz 机房有且仅有三个👻,它们是:

  • image有名字 的👻,也是👻乐团的团长!

  • image没名字 的👻。

  • image:直接消失的👻,这样的👻常常从你身边飘过!

这三只👻就是 cdqz 机房的真神!/bx


题目名字都告诉你了,还是赶紧来推式子吧。

首先对于 Type = 0/1 是简单的,直接顺着思路往下面推就可以了,也就是这个样子:

对于 Type = 0,我们首先把 \(\text{lcm}\) 给处理掉再把四个量分离出来就是

\[\begin{aligned} & \prod_{i=1}^A \prod_{j=1}^B \prod_{k=1}^C \frac {\text{lcm} (i,j)} {\gcd(i,k)} \\ = & \prod_{i=1}^A \prod_{j=1}^B \prod_{k=1}^C \frac {ij} {\gcd(i,j) \gcd(i,k)} \\ = & \left( \prod_{i=1}^A i \right)^{BC} \left( \prod_{j=1}^B j \right)^{AC} \frac {1} {\left( \prod_{i=1}^A \prod_{j=1}^B \gcd(i,j) \right)^C \left( \prod_{i=1}^A \prod_{k=1}^C \gcd(i,k) \right)^B } \end{aligned} \]

前面两项是可以直接用阶乘完成的,也就是说我们只需要求

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} f(n,m) & = \prod_{i=1}^n \prod_{j=1}^m \gcd(i,j) \\ & = \prod_{d=1}^{\min(n,m)} d^{\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j)=d]} \\ & = \prod_{d=1}^{\min(n,m)} d^{\sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} [\gcd(i,j)=1]} \\ & = \prod_{d=1}^{\min(n,m)} d^{\sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} \sum_{t \mid i,t \mid j} \mu(t)} \\ & = \prod_{d=1}^{\min(n,m)} d^{\sum_{t=1}^{\min(\lf \frac n d \rf,\lf \frac m d \rf)} \mu(t) \lf \frac n {td} \rf \lf \frac m {td} \rf} \end{aligned} \]

这个时候你可以把上面的指数部分单独提出来用一个函数完成,这样就可以做到线性,是可以过的,也就是后面代码1给出的(把三个 Type 分开了写的)。

但是你推到后面会发现这其实也是 Type = 2 的子问题,而这个式子是可以 \(\mathcal O(\sqrt n)\) 解决的,所以还是再推一步,这一步也是比较显然的,就是你把 \(t\) 提下来再用 \(T\) 代替 \(td\)

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} f(n,m) & = \prod_{d=1}^{\min(n,m)} d^{\sum_{t=1}^{\min(\lf \frac n d \rf,\lf \frac m d \rf)} \mu(t) \lf \frac n {td} \rf \lf \frac m {td} \rf} \\ & = \prod_{d=1}^{\min(n,m)} \prod_{t=1}^{\min(n,m)} d^{\mu(t) \lf \frac n {td} \rf \lf \frac m {td} \rf} \\ & = \prod_{T=1}^{\min(n,m)} \left( \prod_{d \mid T} d^{\mu(\frac T d)} \right)^{\lf \frac n T \rf \lf \frac m T \rf} \end{aligned} \]

而中间那一块是可以直接用 \(\mathcal O(n \log n)\) 的时间复杂度预处理出来的(直接暴力枚举),所以单次求就是 \(\mathcal O(\sqrt n)\)

恭喜你,获得了 \(20pts\) 的高分!代码


现在我们来研究 Type = 1,用同样的思路,写出来的式子也是简单的

\[\begin{aligned} & \prod_{i=1}^A \prod_{j=1}^B \prod_{k=1}^C \left( \frac {ij} {\gcd(i,j) \gcd(i,k)} \right)^{ijk} \\ = & \left( \prod_{i=1}^A i^{i \sum_{j=1}^B \sum_{k=1}^C} jk \right) \left( \prod_{j=1}^B j^{j \sum_{i=1}^A \sum_{k=1}^C ik} \right) \frac 1 {\left( \prod_{i=1}^A \prod_{j=1}^B \gcd(i,j)^{ij \sum_{k=1}^C k} \right) \left( \prod_{i=1}^A \prod_{k=1}^C \gcd(i,k)^{ik \sum_{j=1}^B j} \right) } \end{aligned} \]

把前面两项提出来就是形如

\[\left( \prod_{i=1}^A i^i \right)^{\left( \sum_{j=1}^B j \right) \left( \sum_{k=1}^C k \right)} \]

预处理一下 \(\prod_{i=1}^n i^i\) 可以直接用快速幂求出。

而对于后面两项,也就是求

\[\prod_{i=1}^n \prod_{j=1}^m \gcd(i,j)^{ij} \]

这个东西推导方式就较为类似了,笔者并没有把它推导 \(\mathcal O(\sqrt n)\),而是把指数单独拿出来处理了。

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} = & \prod_{d=1}^{\min(n,m)} d^{\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j)=d]ij} \\ = & \prod_{d=1}^{\min(n,m)} d^{d^2 \sum_{i=1}^{\lf \frac n d \rf} \sum_{j=1}^{\lf \frac m d \rf} [\gcd(i,j)=1]ij} \end{aligned} \]

于是可以把指数部分提出来,就变成了求

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} g(n,m) = & \sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j) = 1] ij \\ = & \sum_{i=1}^n \sum_{j=1}^m ij \sum_{d \mid i,d \mid j} \mu(d) \\ = & \sum_{d=1}^{\min(n,m)} \mu(d) d^2 \frac {\lf \frac n d \rf \left( \lf \frac n d \rf +1 \right)} 2 \frac {\lf \frac m d \rf \left( \lf \frac m d \rf +1 \right)} 2 \end{aligned} \]

然后两次整除分块就可以完成。

很明显和上面 Type = 0 的优化类似,这时可以做到 \(\mathcal O(\sqrt n)\) 的,但是毕竟瓶颈也不在这里,式子也比较复杂,你直接这样作就好了。

预处理一下 \(\prod_{i=1}^n i^{i^2}\)\(\sum_{i=1}^n \mu(i)i^2\) 即可,于是你就有 \(60pts\) 啦!代码


最后来搞 Type = 2 的情况,按照相同的思路先展开一下

\[\begin{aligned} & \prod_{i=1}^A \prod_{j=1}^B \prod_{k=1}^C \left( \frac {ij} {\gcd(i,j) \gcd(i,k)} \right)^{\gcd(i,j,k)} \\ = & \left( \prod_{i=1}^A i ^{\sum_{j=1}^B \sum_{k=1}^C \gcd(i,j,k)} \right) \left( \prod_{j=1}^B j ^{\sum_{i=1}^A \sum_{k=1}^C \gcd(i,j,k)} \right) \frac 1 { \left( \prod_{i=1}^A \prod_{j=1}^B \gcd(i,j)^{\sum_{k=1}^C \gcd(i,j,k)} \right) \left( \prod_{i=1}^A \prod_{k=1}^C \gcd(i,k)^{\sum_{j=1}^B \gcd(i,j,k)} \right) } \end{aligned} \]

对于前两项,其实就是(后面的 \(\min\) 都代表 \(\min(A,B,C)\)

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \prod_{i=1}^A i ^{\sum_{j=1}^B \sum_{k=1}^C \gcd(i,j,k)} \\ = & \prod_{d=1}^{\min} \prod_{i=1}^{\lf \frac A d \rf} (id)^{\sum_{j=1}^{\lf \frac B d \rf} \sum_{k=1}^{\lf \frac C d \rf} [\gcd(i,j,k) = 1] d} \\ = & \prod_{d=1}^{\min} \prod_{i=1}^{\lf \frac A d \rf} (id)^{d \sum_{j=1}^{\lf \frac B d \rf} \sum_{k=1}^{\lf \frac C d \rf} \sum_{t \mid i,t \mid j,t \mid k} \mu(t)} \\ = & \prod_{d=1}^{\min} \prod_{t=1}^{\min} \prod_{i=1}^{\lf \frac A {td} \rf} (itd)^{d \mu(t) \lf \frac B {td} \rf \lf \frac C {td} \rf} \end{aligned} \]

像往常一样,我们直接用 \(T\) 代替 \(td\),而后面的 \(\sum_{d \mid T} d \mu\left( \frac T d \right)\) 也就是 \(\text{id} * \mu = \varphi\),我们就可以得到

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} = & \prod_{T=1}^{\min} \prod_{i=1}^{\lf \frac A T \rf} (Ti)^{\varphi(T) \lf \frac B {T} \rf \lf \frac C {T} \rf} \end{aligned} \]

\(T\) 提出去就变成了

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} = & \left(\prod_{T=1}^{\min} T^{\varphi(T) \lf \frac A T \rf \lf \frac B T \rf \lf \frac C T \rf} \right) \left( \prod_{T=1}^{\min} \prod_{i=1}^{\lf \frac A T \rf} i^{\varphi(T) \lf \frac B T \rf \lf \frac C T \rf} \right) \end{aligned} \]

容易发现这两项都可以用整除分块做出来的,稍微预处理一下 \(\varphi\) 的前缀和就可以了。

而对于后面两项,也就是求

\[\prod_{i=1}^A \prod_{j=1}^B \gcd(i,j)^{\sum_{k=1}^C \gcd(i,j,k)} \]

按照之前的经验,我们尝试去枚举 \(\gcd(i,j)\),令

\[g(x,n) = \sum_{i=1}^n \gcd(x,k) = \sum_{d \mid x} \varphi(d) \left \lfloor \frac n d \right \rfloor \]

然后就有

\[\prod_{d=1}^{\min} d^{g(d,c)\sum_{i=1}^A \sum_{j=1}^B [\gcd(i,j)=d]} \]

你可以自己尝试推一下,就会发现只能用 \(O(n \log n)\) 的时间复杂度完成单次的查询,根本过不了!


那怎么办呢?

式子中还存在一个 \(\gcd\),那么我们就尝试去枚举 \(\gcd(i,j,k)\) 于是式子就变成了:

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \prod_{i=1}^A \prod_{j=1}^B \gcd(i,j)^{\sum_{k=1}^C \gcd(i,j,k)} \\ = & \prod_{d=1}^{\min} \prod_{i=1}^{\lf \frac A d \rf} \prod_{j=1}^{\lf \frac B d \rf} (d \gcd(i,j))^{d \sum_{k=1}^{\lf \frac C d \rf} [\gcd(i,j,k) = 1]} \\ = & \prod_{d=1}^{\min} \prod_{i=1}^{\lf \frac A d \rf} \prod_{j=1}^{\lf \frac B d \rf} (d \gcd(i,j))^{d \sum_{k=1}^{\lf \frac C d \rf} \sum_{t \mid i,t \mid j,t \mid k} \mu(t)} \\ = & \prod_{d=1}^{\min} \prod_{t=1}^{\min} \prod_{i=1}^{\lf \frac A {td} \rf} \prod_{j=1}^{\lf \frac B {td} \rf} (td\gcd(i,j))^{d\mu(t)\lf \frac C {td} \rf} \\ = & \prod_{T=1}^{\min} \prod_{i=1}^{\lf \frac A T \rf} \prod_{j=1}^{\lf \frac B T \rf} (T\gcd(i,j))^{\varphi(T)\lf \frac C T \rf} \\ = & \left( \prod_{T=1}^{\min} T^{\varphi(T) \lf \frac A T \rf \lf \frac B T \rf \lf \frac C T \rf} \right) \left( \prod_{T=1}^{\min} \prod_{i=1}^{\lf \frac A T \rf} \prod_{j=1}^{\lf \frac B T \rf} \gcd(i,j)^{\varphi(T) \lf \frac C T \rf} \right) \end{aligned} \]

上面的内容和之前推第一部分类似,而现在我们发现其实中间的

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \prod_{i=1}^{\lf \frac A T \rf} \prod_{j=1}^{\lf \frac B T \rf} \gcd(i,j) \]

其实就是 Type = 0 中我们推的 \(f\) 函数,于是整个式子就变成了

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \left( \prod_{T=1}^{\min} T^{\varphi(T) \lf \frac A T \rf \lf \frac B T \rf \lf \frac C T \rf} \right) \left( \prod_{T=1}^{\min} \left( \prod_{T'=1}^{\min(\lf \frac A T \rf,\lf \frac B T \rf)} \left( \prod_{d \mid T'} d^{\mu\left( \frac {T'} d \right)} \right)^{\lf \frac A {TT'} \rf \lf \frac B {TT'} \rf} \right)^{\varphi(T) \lf \frac C T \rf} \right) \]

惊奇地发现这两部分前面的那一块其实是一样的,于是它们就抵消啦!

所以我们需要求的就是

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \prod_{T=1}^{\min} \prod_{i=1}^{\lf \frac A T \rf} i^{\varphi(T) \lf \frac B T \rf \lf \frac C T \rf} \]

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \prod_{T=1}^{\min} \left( \prod_{T'=1}^{\min(\lf \frac A T \rf,\lf \frac B T \rf)} \left( \prod_{d \mid T'} d^{\mu\left( \frac {T'} d \right)} \right)^{\lf \frac A {TT'} \rf \lf \frac B {TT'} \rf} \right)^{\varphi(T) \lf \frac C T \rf} \]

于是你就可以用两次整除分块线性求出来啦!


这样你就推出了本题的全部式子,写的时候注意细节,在指数上面的东西注意模的是 \(mod-1\) 而不是 \(mod\),整除分块不要手误了就行。

预处理出一些必要的量是根本不卡常的。代码1代码2


本题存在对于 Type = 2 的情况求 \(\ln\)\(\exp\) 回去的做法,具体可以去本题题解区。但笔者还是更喜欢莫反做法。


P3700 [CQOI2017] 小 Q 的表格

为了完成任务,小 Q 需要列一个表格,表格有无穷多行,无穷多列,行和列都从 \(1\) 开始标号。为了完成任务,表格里面每个格子都填了一个整数,为了方便描述,小 Q 把第 \(a\) 行第 \(b\) 列的整数记为 \(f(a, b)\)。为了完成任务,这个表格要满足一些条件:

  1. 对任意的正整数 \(a, b\),都要满足 \(f(a, b) = f(b, a)\)
  2. 对任意的正整数 \(a, b\),都要满足 \(b \times f(a, a + b) = (a + b) \times f(a, b)\)

为了完成任务,一开始表格里面的数很有规律,第 \(a\) 行第 \(b\) 列的数恰好等于 \(a \times b\),显然一开始是满足上述两个条件的。为了完成任务,小 Q 需要不断的修改表格里面的数,每当修改了一个格子的数之后,为了让表格继续满足上述两个条件,小 Q 还需要把这次修改能够波及到的全部格子里都改为恰当的数。由于某种神奇的力量驱使,已经确保了每一轮修改之后所有格子里的数仍然都是整数。为了完成任务,小 Q 还需要随时获取前 \(k\) 行前 \(k\) 列这个有限区域内所有数的和是多少,答案可能比较大,只需要算出答案 \({} \bmod 1,000,000,007\) 之后的结果。

\(1 \le m \le {10}^4\)\(1 \le a, b, k \le n \le 4 \times {10}^6\)\(0 \le x \le {10}^{18}\)

建议盯着式子发呆。


首先,由于 \(f(a,b) = f(b,a)\) 所以我们只需要考虑半张表。

而你把第二个式子换一种写法就是

\[\frac {f(a,b)} {ab} = \frac {f(a,a+b)} {a(a+b)} \]

多写几个就变成了

\[\frac {f(a,b)} {ab} = \frac {f(a,ka+b)} {a(ka+b)} \]

那么换一种写法就是

\[\frac {f(a,b)} {ab} = \frac {f(a,b \bmod a)} {a (b \bmod a)} \]

我们发现这个东西和辗转相除求 gcd 是一样的,那么我们就可以得到这个很好的性质

\[\frac {f(a,b)} {ab} = \frac {f(\gcd(a,b),\gcd(a,b))} {\gcd(a,b)^2} \]

那么

\[f(a,b) = f(d,d) \frac {ab} {d^2} \]

于是我们要求的答案其实就是

\[\newcommand {\lf} {\left \lfloor} \newcommand {\rf} {\right \rfloor} \begin{aligned} & \sum_{i=1}^k \sum_{j=1}^k f(i,j) \\ = & \sum_{d=1}^k f(d,d) \sum_{i=1}^k \sum_{j=1}^k [\gcd(i,j) = d] \frac {ab} {d^2} \\ = & \sum_{d=1}^k f(d,d) \sum_{i=1}^{\lf \frac k d \rf} \sum_{j=1}^{\lf \frac k d \rf} [\gcd(i,j)=1] ij \end{aligned} \]

那么现在就是希望求

\[g(n)= \sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j)=1] ij \]

我们需要预处理出所有的 \(g(n)\) 才能在查询时以高效的方法完成。


但是按照上一道题我们推式子的方法,发现单次是 \(\sqrt n\) 的,根本过不了!

这时我们考虑在 SP5971 中求的东西

\[\sum_{i=1}^n [\gcd(i,n)=1] i = \frac {n (\varphi(n) + \epsilon(n))} 2 \]

带进去就是

\[\begin{aligned} g(n) = & \sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j)=1] ij \\ = & 2 \sum_{i=1}^n \sum_{j=1}^i [\gcd(i,j)=1] i j - 1 \\ = & 2 \sum_{i=1}^n i \frac {i (\varphi(i)+\epsilon(i))} 2 - 1 \\ = & \sum_{i=1}^n i^2 \varphi(i) \end{aligned} \]

于是这个东西就可以线性递推出来了,只要我们能够动态维护 \(f(d,d)\) 的区间和,那么最后整除分块一下就可以在 \(\mathcal O(\sqrt n)\) 的时间复杂度内求出来了。


但是我们发现上面所说的 \(f(d,d)\) 的区间和需要做到 \(\mathcal O(1)\) 查询,由于 \(m \le 10^4\),所以我们不难想到用 \(\mathcal O(\sqrt n) - \mathcal O(1)\) 的分块来维护。

具体每个块每个元素维护块内的前缀和,在每一个块末尾维护块间的前缀和,修改时暴力修改即可。

总时间复杂度 \(\mathcal O(m \sqrt n)\),这道题为我们引入了一类式子新的推导方式。代码


posted @ 2024-05-21 13:13  H_W_Y  阅读(13)  评论(0编辑  收藏  举报