考虑直接枚举 gcd=p ,枚举倍数统计出 fp=∑[p∣ xi] ,那么 p∣gcd 方案数即为 ( kfp) ,考虑容斥,去除 gcd=tp 的情况,减去这部分答案,即 ( kfp)−∑( kftp) ,答案即 p( kfp)−∑( kftp)。预处理 P 内的质数,然后求出 φ(P) 使用欧拉降幂即可,并且由于 k 很小,所以可以直接 O(nk) 暴力杨辉三角求组合数。 时间复杂度 O( P+T(log P P+xlog P+nk))
实际上只需要考虑 p 为质数的情况,但是对于 p2∣gcd (设有 t2=( kfp2) 个子集满足), p( kfp) 只计算了 (p1)t2 的贡献,而实际上这部分贡献为 (p2)t2 ,少算了 pt2 。对于 pc 也同理,归纳可得 p 的总贡献为 ∑( kfpc) 。 时间复杂度O( P+T(log P P+log xxlog P+nk))
虽然实际上在 P 比较小的时候会因为没有 +φ(P) 导致答案错误,但是题目中 P 有个较大的下限所以不影响。
代码