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]\)
浙公网安备 33010602011771号