题目描述
给定一个$n$, 对所有满足$1 \leq a, b, c$并且$a + b + c = n$的三元组$a, b, c$求$\sum lcm(c, gcd(a, b))$
数据范围
$1 \leq n \leq 10^5$
题解
首先$\sum lcm(c, gcd(a, b)) = \sum \frac{c \times gcd(a, b)}{gcd(gcd(a, b), c)}$
然后三个变量不好看, 由于有$a + b + c = n$, 所以可以把$b$用$n - a - c$表示, 则由更相减损数得$gcd(a, b) = gcd(a, n - a - c) = gcd(a, n - c)$
原式变为$\sum \frac{c \times gcd(a, n - c)}{gcd(gcd(a, n - c), c)}$
考虑枚举$c$, 原式变为$\sum c \sum \frac{gcd(a, n - c)}{gcd(gcd(a, n - c), c)}$, 如果再枚举$a$的话时间复杂度就是$O(n^2)$的了, 肯定过不了, 所以考虑快速计算$\sum \frac{gcd(a, n - c)}{gcd((gcd(a, n - c), c)}$
然后就不会了
真正的题解
首先$\sum lcm(c, gcd(a, b))$, 这个在化简的时候根本就不用展开
考虑枚举$c$, 现在相当于$c$固定了, 设$d = gcd(a, b)$, 我们枚举$d$, 求$gcd(a, b) = d$的有序对$(a, b)$的个数这个题就做出来了, 当然这个过程的时间复杂度最高只能是$O(\sqrt n)$级别的
这就用到了我们上述推导中的$gcd(a, b) = gcd(a, n - c)$, 这说明$d$必然是$n - c$的约数, 而约数的个数恰好是根号级的
现在我们确定了$c$, 确定了$d$, 怎么求出有序对$(a, b)$的数量呢, 可以看出我们只需要求出$gcd(a, n - c) = d$的$a$的数量就可以了
$a$显然应该是$d$的倍数, 设$a = k_1 d, n - c = k_2 d$,那么既然$gcd(a, n - c) = d$, 必然有$gcd(k_1, k_2) = 1$,
这里还应该有$k_1 < k_2$, 而且在$c, d$固定的情况下$k_2$是已知的, 则实际上$k_1$的数量就是$\phi(k_2) = \phi(\frac{n - c}{d})$
这也就是$a$的数量, 也就是有序对$(a, b)$的数量
$\phi()$预处理就好了
这题不看题解我绝对想不到, 而且看了题解还得琢磨一会才能明白
代码
1 |
|