AtCoder Beginner Contest 230 G GCD Permutation
题目可以转化成所有 \(\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\) 的因数个数。
同类题目:CF1575G GCD Festival