AtCoder Beginner Contest 230 G GCD Permutation

洛谷传送门

AtCoder 传送门

题目可以转化成所有 \(\gcd(p_i,p_j) \ne 1\) 的对数减去 \(\gcd(i,j) = 1\)\(\gcd(p_i,p_j) \ne 1\) 的对数。

可以考虑外面套一层容斥,枚举 \(d\),计算下标为 \(d\) 的倍数的数中满足 \(\gcd(p_i,p_j) \ne 1\)\((i,j)\) 有多少对。就是先算出 \(d|\gcd(i,j)\) 的答案,最后容斥得出 \(d = \gcd(i,j)\) 的答案。

现在考虑子问题:给定一些数,求 \(\gcd(a_i,a_j) \ne 1\)\((i,j)\) 对数。可以用总对数减去 \(\gcd(a_i,a_j) = 1\) 的对数。

\(c_x\)\(x\)\(a\) 中的出现次数,然后推式子:

\[\sum\limits_{i=1}^n \sum\limits_{j=1}^n [\gcd(a_i,a_j)=1] \]

\[= \sum\limits_{i=1}^n \sum\limits_{j=1}^n c_i c_j [\gcd(i,j)=1] \]

\[= \sum\limits_{i=1}^n \sum\limits_{j=1}^n c_i c_j \sum\limits_{p|i,p|j} \mu(p) \]

\[= \sum\limits_{p=1}^n \mu(p) \sum\limits_{i=1}^{\left\lfloor\frac{n}{p}\right\rfloor}c_{ip} \sum\limits_{j=1}^{\left\lfloor\frac{n}{p}\right\rfloor}c_{jp} \]

\[= \sum\limits_{p=1}^n \mu(p) ( \sum\limits_{i=1}^{\left\lfloor\frac{n}{p}\right\rfloor} c_{ip} )^2 \]

考虑每加进来一个数 \(x\),答案的变化量。对于每个 \(k|x\),记 \(b_k\) 表示已经加进来的数中 \(k\) 的倍数的数量,答案新增 \(\mu(k) \times [(b_k + 1)^2 - b_k^2] = \mu(k) \times (2b_k + 1)\)。预处理出因数,动态维护答案即可。

总时间复杂度大约是 \(O(n \log n \max\limits_{i=1}^n d(i))\),其中 \(d(i)\)\(i\) 的因数个数。

code

同类题目:CF1575G GCD Festival

posted @ 2022-11-13 20:27  zltzlt  阅读(28)  评论(0编辑  收藏  举报