P1891 疯狂 LCM

题目链接

\[\begin{align*} \sum\limits_{i=1}^{n}lcm(i,n) & = n\sum\limits_{i=1}^{n}\frac{i}{\gcd(i,n)} \\ & = n\sum\limits_{d|n}\sum\limits_{i=1}^n\frac{i}{d}[\gcd(i,n) == d] \\ & = n\sum\limits_{d|n}\sum\limits_{i=1}^{\frac{n}{d}}i[\gcd(i,\frac{n}{d}) == 1] \\ & = n\sum\limits_{d|n}\sum\limits_{i=1}^{d}i[\gcd(i,d) == 1] \end{align*} \]

\(\sum\limits_{i=1}^{d}i[\gcd(i,d) == 1]\)\(d\) 互质的所有数之和。

不难发现,\(\gcd(i,d) = 1\) 时,\(\gcd(d-i,d) = 1\)

所以,\(i\) 是成对出现的 \((d \neq 1)\) 。所以,

\[\sum\limits_{i=1}^{d}i[\gcd(i,d) == 1] = \frac{\varphi(d)}{2}d \]

\(O(\sqrt{n})\) 每次枚举, \(O(n)\) 预处理 \(\varphi\)​。

但是,上面的方法时限太极限了。代码写丑一点可能就过不了,所以我们可以预处理答案。

定义答案数组为 \(f\)

易得,对于一个数 \(i\) ,它对它的所有倍数 \(p_i\) 都会产生 \(\frac{\varphi(i)}{2}i\) 贡献。

所以,枚举每个数和他的倍数即可。

\(O(1)\) 每次查询, \(O(n \log n)\) 预处理。

posted @ 2025-07-11 23:40  fyv233  阅读(9)  评论(0)    收藏  举报