SP5971 LCMSUM

官方链接:LCMSUM - LCM Sum

洛谷搬运链接:SP5971 LCMSUM - LCM Sum

题意

TT 次询问,每次询问给定 nn,求

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

1T3×1051\leqslant T\leqslant 3\times10^5
1n1061\leqslant n\leqslant 10^6

思路

推式子:

i=1nlcm(i,m)=i=1ningcd(i,n)=dni=1nind[gcd(i,n)=d]=dni=1nind[gcd(id,nd)=1]=i=iddni=1ndin[gcd(i,nd)=1]=ndni=1di[gcd(i,d)=1]\begin{aligned} \sum_{i=1}^n\text{lcm}(i,m)&=\sum_{i=1}^n\frac{i\cdot n}{\text{gcd}(i,n)}\\ &=\sum_{d|n}\sum_{i=1}^n\frac{i\cdot n}{d}[\text{gcd}(i,n)=d]\\ &=\sum_{d|n}\sum_{i=1}^n\frac{i\cdot n}{d}[\text{gcd}(\frac{i}{d}, \frac{n}{d})=1]\\ &\xlongequal{i=\frac{i}{d}}\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}i\cdot n[\text{gcd}(i, \frac{n}{d})=1]\\ &=n\sum_{d|n}\sum_{i=1}^di\cdot[\text{gcd}(i, d)=1] \end{aligned}

f(d)=i=1di[gcd(i,d)=1]f(d)=\sum_{i=1}^di\cdot[\text{gcd}(i, d)=1],下面有两种方法对 f(d)f(d) 进行化简:

法1: 由简化剩余系的性质:

d=1d=1 时:f(1)=1f(1)=1

d1d\neq 1 时:

gcd(i,d)=1\text{gcd}(i, d) = 1,则 gcd(di,d)=1\text{gcd}(d-i,d)=1,这说明简化剩余系中的元素一定是成对存在的,而且它们和正好是 dd,简化剩余系大小为 φ(d)\varphi(d)(也说明了为什么 φ(d)\varphi(d) 一定是偶数)。

于是 f(d)=φ(d)d2\displaystyle f(d)=\frac{\varphi(d)\cdot d}{2}

法2: 用Dirichlet卷积变化:

f(n)=i=1di[gcd(i,d)=1]=i=1ditgcd(i,d)μ(t)=tdi=1d[ti]iμ(t)=tdi=1dtitμ(t)=tdtμ(t)i=1dti=tdμ(t)t(1+dt)dt2=tdμ(t)(1+dt)d2=d2td(μ(t)+μ(t)dt)=d2((μ1)(d)+(μId)(d))=d2(ε(d)+φ(d))\begin{aligned} f(n)&=\sum_{i=1}^di\cdot[\text{gcd}(i, d)=1]\\ &=\sum_{i=1}^di\cdot\sum_{t|\text{gcd}(i,d)}\mu(t)\\ &=\sum_{t|d}\sum_{i=1}^d[t|i]\cdot i\cdot \mu(t)\\ &=\sum_{t|d}\sum_{i=1}^{\frac{d}{t}}it\cdot \mu(t)\\ &=\sum_{t|d}t\cdot\mu(t)\sum_{i=1}^{\frac{d}{t}}i\\ &=\sum_{t|d}\mu(t)\cdot t\cdot\frac{(1+\frac{d}{t})\frac{d}{t}}{2}\\ &=\sum_{t|d}\mu(t)\cdot\frac{(1+\frac{d}{t})d}{2}\\ &=\frac{d}{2}\cdot\sum_{t|d}(\mu(t)+\mu(t)\cdot\frac{d}{t})\\ &=\frac{d}{2}\cdot((\mu\ast\texttt{1})(d)+(\mu\ast\text{Id})(d))\\ &=\frac{d}{2}\cdot(\varepsilon(d)+\varphi(d)) \end{aligned}

其中的数论函数 ε,μ,1,Id\varepsilon, \mu, \texttt{1}, \text{Id}积性函数-例子

两种解法结果相同,明显第一个简单多(

于是问题最终转化为求解:

n2(dndφ(d)+1)\frac{n}{2}(\sum_{d|n}d\cdot\varphi(d)+1)

g(n)=dndφ(d)g(n)=\sum_{d|n}d\cdot\varphi(d)

又有两种方法求 g(n)g(n)

法1: 枚举法(复杂度 O(NlogN)O(NlogN)):

用线性筛求 φ\varphi,然后直接枚举 dd 即可。

for (int i = 1; i <= n; i++) {
	for (int j = 1; j * i <= n; j++) {
		g[i*j] += i * phi[i];
	}
}

法2: 线性筛法(复杂度 O(N)O(N)):

不难证明 g(n)g(n) 是积性函数,这样就可以使用筛法来求了,先算几个特殊值:

  • g(1)=1g(1)=1

  • g(p)=φ(1)1+φ(p)p=p(p1)+1g(p)=\varphi(1)\cdot1+\varphi(p)\cdot p=p(p-1)+1

  • g(pk)=1+i=1kφ(pi)pi=1+i=1k(p1)p2i1g(p^k)=1+\sum_{i=1}^k\varphi(p^i)\cdot p^i=1+\sum_{i=1}^k (p-1)p^{2i-1}

i=apw,w1,gcd(a,p)=1i=a\cdot p^w, w\geqslant1, \text{gcd}(a, p)=1,若我们在线性筛中要去求:g(ip)g(i\cdot p),则:

g(ip)=g(a)g(pw+1)g(i)=g(a)g(pw)g(ip)g(i)=g(a)(p1)p2w+1同理g(i)g(ip)=g(a)(p1)p2w1消去g(a)g(ip)=g(i)+(g(i)g(ip))p2\begin{aligned} g(i\cdot p)&=g(a)\cdot g(p^{w+1})\\ g(i)&=g(a)\cdot g(p^w)\\ \Rightarrow g(i\cdot p)-g(i)&=g(a)\cdot (p-1)p^{2w+1}\\ \text{同理}\Rightarrow g(i)-g(\frac{i}{p})&=g(a)\cdot (p-1)p^{2w-1}\\ &\text{消去}g(a)\\ \Rightarrow g(i\cdot p)&=g(i)+(g(i)-g(\frac{i}{p}))\cdot p^2 \end{aligned}

总复杂度 O(N)O(N),下面代码使用线性筛法写的。


SP5971 LCMSUM
https://wty-yy.github.io/posts/49145/
作者
wty
发布于
2021年8月17日
许可协议