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)\) 预处理。