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\) 的贡献,如下图。
就是对 \(\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 例题
接下来,我们来将一些例题,由于比较多,所以单独提出来了。部分例题会用到上面的常见技巧。
前面的一些例题中有些写得比较简略,有些可能是👻乐团中的子问题,如果看不懂可以在那道题题解中找一下,或者直接问我。
对于给出的 \(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。
给定 \(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。
\(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)\)。代码。
\(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)\)。代码。
给定 \(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 一样了。直接做就是线性的。代码。
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)\)。
给定 \(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}
\]
于是两次整除分块就可以线性完成了,代码相当好些。代码。
对于 \(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。
有 \(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)\)。代码。
给定 \(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)\)。代码。
给定 \(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 Challenge 和 CF235E Number Challenge。
东风谷 早苗(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 机房有且仅有三个👻,它们是:
-
:有名字 的👻,也是👻乐团的团长!
-
:没名字 的👻。
-
:直接消失的👻,这样的👻常常从你身边飘过!
这三只👻就是 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\) 回去的做法,具体可以去本题题解区。但笔者还是更喜欢莫反做法。
为了完成任务,小 Q 需要列一个表格,表格有无穷多行,无穷多列,行和列都从 \(1\) 开始标号。为了完成任务,表格里面每个格子都填了一个整数,为了方便描述,小 Q 把第 \(a\) 行第 \(b\) 列的整数记为 \(f(a, b)\)。为了完成任务,这个表格要满足一些条件:
- 对任意的正整数 \(a, b\),都要满足 \(f(a, b) = f(b, a)\);
- 对任意的正整数 \(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)\),这道题为我们引入了一类式子新的推导方式。代码。