牛客挑战赛 56 D
给出一个排列 \(p\),求满足条件的三元组 \((i, j, k)\) 个数:
- \(1 \le i < j < k \le n\)
- \(\gcd(p_i, p_j) = \gcd(p_j, p_k)\)
\(n \le 10 ^ 5\)。
莫比乌斯反演
感觉大半年没有复习过莫比乌斯反演了,于是这个题直接帮我复习了一下(真 康复训练)。
考虑固定 \(j\) 计算贡献,然后就是求前缀和后缀中 \(\gcd(p_i, x) = k\) 的个数了,记出现之前每个数出现次数为 \(cnt\),那么贡献为:
\[\begin{aligned}
ans &= \sum_{i = 1}^{\left\lfloor\frac{n}{k}\right\rfloor}cnt_{ik}[\gcd(i, \frac{x}{k}) = 1]\\
&=\sum_{i = 1}^{\left\lfloor\frac{n}{k}\right\rfloor}cnt_{ik}\sum_{d | \gcd(i, \frac{x}{k})} \mu(d)\\
&=\sum_{d | \frac{x}{k}}\mu(d) \sum_{i = 1}^{\left\lfloor\frac{n}{kd}\right\rfloor} cnt_{ikd}\\
\end{aligned}
\]
动态维护后面那个 \(cnt\) 即可。
复杂度好像是 \(1 \sim n\) 所有约数的约数个数之和。
本博客作者:Werner_Yin(https://www.cnblogs.com/werner-yin/) ,转载时请注明出处,谢谢支持!