🍕🏠🌋 当前时间是:

 

CF1043F

题目链接

description

给定一个正整数集合 \(\{a\}\),求其大小最小的最大公约数为 1 的子集大小。

不存在输出 -1

\(n\leq 3\times 10^5\)

值域 \(W\leq 3\times 10^5\)

solution

显然有解的充分必要条件是 \(\gcd\{a_i\}=1\)

当存在解的时候,答案不会特别大(事实上答案最大为 7)。于是我们可以从小到大枚举答案,判断是否有解。

\(f_k(x)\) 表示选取 \(k\) 个数,使它们的最大公约数为 \(x\)方案数

也就是说,我们枚举 \(k\),碰到第一个 \(k\) 满足 \(f_k(1)>0\) 即找到了最优解。

下面考虑如何求 \(f_k(x)\)

\(g_k(x)\) 表示选 \(k\) 个数,使得 \(x\) 是这些数的公约数的方案数。那么 \(f_k(x)=g_k(x)-\sum\limits_{i=2}^{\lfloor\frac{W}{x}\rfloor} f_k(ix)\)

设集合 \(\{a\}\) 中有 \(s_x\) 个数包含因数 \(x\),则 \(g_k(x)=\dbinom{s_x}{k}\)

于是从后往前递推即可。

时间复杂度 \(O(n\ln W)\)

hint

实现的时候可以将方案数模上一个大质数,便于计算组合数。

这个题的一个比较有趣的技巧是把判断有无解转化为方案数是否大于 0。

code

参考代码:Submission #222008071 - Codeforces

posted @ 2023-09-09 08:20  zzafanti  阅读(36)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end