牛客挑战赛 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\) 所有约数的约数个数之和。

  代码

posted @ 2022-01-07 22:39  Werner_Yin  阅读(47)  评论(2编辑  收藏  举报