洛谷 P4240 毒瘤之神的考验
题目简述
求
\[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)
\]
答案对 \(998244353\) 取模.
推导过程
默认本文中出现的 \(p\) 均为质数. 不妨设 \(n\leq m\).
首先,需要证明
\[\varphi(ab)=\frac{\varphi(a)\varphi(b)\gcd(a,b)}{\varphi\bigl(\gcd(a,b)\bigr)}
\]
设
\[a=\prod_p p^{\alpha_i},\;b=\prod_p p^{\beta_i}
\]
已知
\[\varphi(n)=n\cdot\prod_{p|n}\left(1-\frac{1}{p}\right)
\]
则
\[\varphi(ab)=ab\cdot\prod_{p|ab}\left(1-\frac{1}{p}\right)
\]
\[\begin{align*}
\frac{\varphi(a)\varphi(b)\gcd(a,b)}{\varphi\bigl(\gcd(a,b)\bigr)}&=\frac{a\cdot\prod_{p|a}\bigl(1-\frac{1}{p}\bigr)\cdot b\cdot\prod_{p|b}\bigl(1-\frac{1}{p}\bigr)\cdot\gcd(a,b)}{\gcd(a,b)\cdot\prod_{p|\gcd(a,b)}\bigl(1-\frac{1}{p}\bigr)} \\
&=ab\cdot\frac{\prod_{p|a}\bigl(1-\frac{1}{p}\bigr)\cdot\prod_{p|b}\bigl(1-\frac{1}{p}\bigr)}{\prod_{p|\gcd(a,b)}\bigl(1-\frac{1}{p}\bigr)}
\end{align*}
\]
设 \(A=\{p:p\mid a\},\,B=\{p:p\mid b\}\),则 \(A\cup B=\{p:p\mid ab\},\,A\cap B=\bigl\{p:p\mid\gcd(a,b)\bigr\}\).
\[\begin{align*}
&ab\cdot\frac{\prod_{p|a}\bigl(1-\frac{1}{p}\bigr)\cdot\prod_{p|b}\bigl(1-\frac{1}{p}\bigr)}{\prod_{p|\gcd(a,b)}\bigl(1-\frac{1}{p}\bigr)} \\
=\space&ab\cdot\frac{\prod_{p\in A}\bigl(1-\frac{1}{p}\bigr)\cdot\prod_{p\in B}\bigl(1-\frac{1}{p}\bigr)}{\prod_{p\in A\cap B}\bigl(1-\frac{1}{p}\bigr)} \\
=\space&ab\cdot\prod_{p\in A\cup B}\left(1-\frac{1}{p}\right) \\
=\space&ab\cdot\prod_{p|ab}\left(1-\frac{1}{p}\right)
\end{align*}
\]
因此
\[\varphi(ab)=\frac{\varphi(a)\varphi(b)\gcd(a,b)}{\varphi\bigl(\gcd(a,b)\bigr)}
\]
于是,
\[\begin{align*}
&\sum_{i=1}^n\sum_{j=1}^m\varphi(ij) \\
=&\sum_{i=1}^n\sum_{j=1}^m\frac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi\bigl(\gcd(i,j)\bigr)} \\
=&\sum_{i=1}^n\sum_{j=1}^m\sum_{d=1}^n\left(\bigl[\gcd(i,j)=d\bigr]\cdot\frac{\varphi(i)\varphi(j)d}{\varphi(d)}\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{i=1}^n\sum_{j=1}^m\biggl(\bigl[\gcd(i,j)=d\bigr]\cdot\varphi(i)\varphi(j)\biggr)\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{i=1}^{\lfloor n/d\rfloor}\sum_{j=1}^{\lfloor m/d\rfloor}\biggl(\bigl[\gcd(di,dj)=d\bigr]\cdot\varphi(di)\varphi(dj)\biggr)\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{i=1}^{\lfloor n/d\rfloor}\sum_{j=1}^{\lfloor m/d\rfloor}\biggl(\bigl[\gcd(i,j)=1\bigr]\cdot\varphi(di)\varphi(dj)\biggr)\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{i=1}^{\lfloor n/d\rfloor}\sum_{j=1}^{\lfloor m/d\rfloor}\biggl(\varphi(di)\varphi(dj)\cdot\sum_{x|i,\,x|j}\mu(x)\biggr)\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{x=1}^{\lfloor n/d\rfloor}\left(\mu(x)\cdot\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{dx}\rfloor}\varphi(dx\!\cdot\!i)\varphi(dx\!\cdot\!j)\right)\right) \\
=&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{x=1}^{\lfloor n/d\rfloor}\left(\mu(x)\cdot\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\varphi(dx\!\cdot\!i)\cdot\sum_{j=1}^{\lfloor\frac{m}{dx}\rfloor}\varphi(dx\!\cdot\!j)\right)\right)
\end{align*}
\]
设 \(T=dx\),则 \(x=\frac{T}{d}\),
\[\begin{align*}
&\sum_{d=1}^n\left(\frac{d}{\varphi(d)}\cdot\sum_{x=1}^{\lfloor n/d\rfloor}\left(\mu(x)\cdot\sum_{i=1}^{\lfloor\frac{n}{dx}\rfloor}\varphi(dx\!\cdot\!i)\cdot\sum_{j=1}^{\lfloor\frac{m}{dx}\rfloor}\varphi(dx\!\cdot\!j)\right)\right) \\
=&\sum_{T=1}^n\sum_{d|T}\left(\frac{d\cdot\mu\!\left(\frac{T}{d}\right)}{\varphi(d)}\cdot\sum_{i=1}^{\lfloor n/T\rfloor}\varphi(T\!\cdot\!i)\cdot\sum_{j=1}^{\lfloor m/T\rfloor}\varphi(T\!\cdot\!j)\right) \\
=&\sum_{T=1}^n\left(\sum_{i=1}^{\lfloor n/T\rfloor}\varphi(T\!\cdot\!i)\cdot\sum_{j=1}^{\lfloor m/T\rfloor}\varphi(T\!\cdot\!j)\cdot\sum_{d|T}\frac{d\cdot\mu\!\left(\frac{T}{d}\right)}{\varphi(d)}\right)
\end{align*}
\]
多组查询的优化思路
对于多组测试数据,直接按上面的式子枚举所有 \(T\) 仍然会很慢。注意到
\[\left\lfloor\frac{n}{T}\right\rfloor,
\quad
\left\lfloor\frac{m}{T}\right\rfloor
\]
只有在 \(T\) 变化时才会“少量改变”,所以可以把枚举分成若干段。设当前段内
\[\left\lfloor\frac{n}{T}\right\rfloor = a,
\qquad
\left\lfloor\frac{m}{T}\right\rfloor = b,
\]
则这一段内的贡献可以整体合并为
\[\left(\sum_{T=l}^{r}\alpha(T)\right)\cdot F(a)\cdot F(b),
\]
其中
\[F(x)=\sum_{k=1}^{x}\varphi(k),
\qquad
\alpha(T)=\sum_{d\mid T}\frac{d\mu(T/d)}{\varphi(d)}.
\]
这样就把原来每个 \(T\) 单独处理,变成了“分段处理”,从而适用于 \(T\leq 10^4\)、\(n,m\leq 10^5\) 的多组查询.
预处理时,先用线性筛求出 \(\varphi(1),\dots,\varphi(N)\),再得到前缀和 \(F(x)\),最后对每个查询按上面的分段方式计算答案即可.
浙公网安备 33010602011771号