洛谷 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\) 的约数个数。
提交记录。

浙公网安备 33010602011771号