挺不错的题,原题是 CF 的某个题,但我找不到题号了,所以写个比较易懂的题解方便补,可能废话很多。
首先要有一点初步的观察,可以发现 $\max$ 的求解是很方便的,我们只需要找出所有 $k$ 的倍数,这样一定能让 $\gcd$ 尽可能为 $k$,并且使取的数的个数最多。
然后是最小值。这仍然需要一些观察和经验。我们想要每个取的数都不是 "无用" 的,也就是说,它必须能帮我们 "赶出去" 某些没有用的素因子。
下面是一些经验。假设一开始随便选了一个数 $x(k|x)$,再选一个数 $y(k|y)$,那么必然有 $\gcd(x, y)<x$,否则 $y$ 不如不选。那么有 $\frac{x}{\gcd(x, y)}\ge 2$,因为最小的素因子是 2。
于是我们知道,选数的最小个数其实是 $\mathcal O(\log \max(S_i))$ 级别的,在这道题里面也就 18 个左右。
面对最优化问题关于答案范围的极强约束,一般地,直接枚举答案,转化为 $\forall s\in [1, 18]$,对于 $1\sim n$ 的每个 $k$ 判断是否 "存在" 一种取出 $s$ 个数使得 $\gcd$ 为 $k$ 的方案。
然后是这道题非常巧妙的一个点,一般我们很少遇到判定比计数还困难的题目,这道题就是一个例子。
那怎么办?直接换成计数来做。意识到这一点需要有莫比乌斯反演的功底,这样才能在面对着一个和计数没有关系的题目时,通过诸如 $\gcd = k$ 这样的条件感受出做法。这也给我们启示,有时我们需要用这样的数学直观刺激直觉。
于是我们先枚举 $s$,计算 $F(k,s)$ 表示选 $s$ 个数使得 $\gcd$ 是 $k$ 的倍数,这是简单的,假设原序列有 $p$ 个数是 $k$ 的倍数,那么 $F(k,s)=\mathrm C_{p}^{s}$。$p$ 的计算可以使用狄利克雷后缀和解决,实质上就是高维前缀和的一种拓展。
接下来的操作很平凡,使用莫比乌斯反演,得 $G(k,s)$,即原本要求的方案数,为 $\sum\limits_{k|x}F(x,s)\times \mu(x/k)$。
时间复杂度 $\mathcal O(m\ln m\log m)$。题解好像写的有点魔怔,可能是文化课学多了导致思维也比较呆。