CF1043F题解

最大公约数的经典套路。

容易想到暴力 \(dp\)\(f[i][j]\) 表示前 \(i\) 个数中选出 \(\gcd=j\) 的最小个数。

但事实上本题给出的序列等价于集合,应该往值域的方向思考。

由于本题值域较小,又由 \(\gcd\),不由想到质因数。发现选出一些数互质只跟每个数的质因数种类有关,与次数无关,我们知道 \(300000\) 以内的数最多含有 \(6\) 个不同的质因数,由此可确定答案的上界

如果一个数包含了所有目前最大公因数的质因子,那么这个数可以不要,也就是说,每选 \(1\) 个数,最大公因数的质因子必定减少 \(1\) 种,因此答案的上界为 \(7\)

那么我们可以通过枚举答案将最值问题转化为计数问题。

现在问题转化为选出 \(k\) 个数使它们最大公因数为 \(1\) 是否可行,考虑求 \(\gcd=x\) 的方案数。

这里就有一个经典套路,先求公约数\(x\),再通过容斥算出 \(\gcd=x\),具体而言,设 \(f[i]\) 表示公约数\(i\) (即 \(\gcd\)\(i\) 的倍数)的方案数,\(g[i]\) 表示 \(\gcd=i\) 的方案数。

\(f[i]\)很好求,\(f[i]={{cnt[i]}\choose{k}}\),其中 \(cnt[i]\) 表示 \(a\) 中他有多少 \(i\) 的倍数。

\(g[i]=f[i]-\sum_{j=2}^{ij<N}g[i*j]\)

posted on 2022-11-06 16:56  cool_tyl  阅读(19)  评论(0)    收藏  举报