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

· · 个人记录

题意

\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 的约数个数。

提交记录。