洛谷 P2303 约数&欧拉函数&简单推式子

posted on 2023-09-21 12:22:01 | under 做题记录 | source

题意

\(\sum\limits_{i=1}^{n} gcd(i,n)\)\(n\le 2^{31}\)

思路

看到 \(\rm gcd\) 马上考虑推式子,使得某个项含有 \(\phi\)

观察 \(gcd(i,n)\) 的取值,显然是很少的,那么考虑贡献法:

\[\sum\limits_{i=1}^{n} gcd(i,n)=\sum\limits_{d\mid n} {d*\sum[gcd(i,n)=d]} \]

如何快速求后面这一项呢?这里引入 \(\rm gcd\) 的一个性质:

\[gcd(ka,kb)=k*gcd(a,b) \]

所以 \(\phi\) 可以这样得到:

\[gcd(ka,kb)=k \to gcd(a,b)=1 \]

所以:

\[\sum[gcd(i,n)=d] \]

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

$ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\phi(\frac nd)$

综上:

\[\sum\limits_{i=1}^{n} gcd(i,n)=\sum\limits_{d\mid n}d*\phi(\frac nd) \]

枚举因数并计算欧拉函数即可,时间复杂度 \(O(klogn)\)\(k\) 表示 \(n\) 的约数个数。

提交记录

posted @ 2026-01-14 18:08  Zwi  阅读(1)  评论(0)    收藏  举报