前言
很难不注意到我还有一个线段树合并, 一个神秘的 \(\text{CSP-S T4}\) 排列没有搞, 还有一个 \(\text{T3}\)
不管怎么样一定要注意停滞, 解决
思路
不难发现就是每次取了之后是否放回去的一个期望问题
首先考虑概率期望问题, 本题比较好想的一种做法就是直接利用期望定义来做
我们先处理每次概率空间不变的问题, 也就是每次都把取了的数放回去的情况
处理这个问题时的草稿
考虑一个选择 , 其中 , 而 , 我们取到其的概率是 , 事实上我们就需要找到所有的情形并计算概率与 的乘积之和
考虑怎么处理到所有的情形, 一种想法是
常用的方法是 表示选择到第 个数, 且存在一个公约数是 的第 个质因数这样一种情形的概率本质上是单个数的不同质因数个数有限
这个方法是有问题的, 但是不妨先列出一下转移
然后我们要计算选择一个 的概率来完成这个形态
需要注意的是, 这是一个无穷项求和, 但是并不困难
问题出在哪? 不难发现对于 不为一个质数的情况, 我们显然会算重
当然不难猜测去重是一个容斥的形式, 但是这样子计算复杂度不能保证, 而且由于 的存在, 算重的部分也不好处理
因此我们考虑换成另一种常见的处理方法, 即枚举一个约数
考虑钦定最终 , 不妨找到 的倍数集合 , 则每次我们选择集合内外的概率分别已知, 剩下的就是一个无穷项求和, 可以用等比数列求和公式计算
具体的, 记 表示在 个数中选出 的概率, 求 表示钦定最终 , 找到的形态概率之和
这样仍然会算重, 但是去重是很简单的, 我们只需要倒序处理, 然后每次处理掉 倍数即可
即
到这里我发现我对期望的计算还有问题, 让我们来处理这一部分
不妨同样设置 函数, 但是先不管去重
进而我们可以轻松地完成这一工作
考虑一个选择 \(x_1, x_2, \cdots x_k \mid x_{k + 1}\), 其中 \(\gcd(x_1, x_2, \cdots, x_k) \neq 1\), 而 \(\gcd(x_1, x_2, \cdots, x_k, x_{k + 1}) = 1\), 我们取到其的概率是 \(\dfrac{1}{n^{k + 1}}\), 事实上我们就需要找到所有的情形并计算概率与 \(k\) 的乘积之和
首先, 刻画形态的一种通用方法是 \(\rm{dp}\)
常用的方法是 \(f_{i, j}\) 表示选择到第 \(i\) 个数, 且存在一个公约数是 \(i\) 的第 \(j\) 个质因数这样一种情形的概率\((\)本质上是单个数的不同质因数个数有限\()\)
不难发现对于 \(\gcd(x_1, x_2, \cdots, x_k)\) 不为一个质数的情况, 我们显然会算重
当然不难猜测去重是一个容斥的形式, 但是这样子计算复杂度不能保证, 而且由于 \(x_{k + 1}\) 的存在, 算重的部分也不好处理
我们尝试使用另一种方法, 钦定 \(\gcd(x_1, x_2, \cdots, x_k) = g\), 然后处理符合条件的情形
具体的, 记 \(p(x)\) 表示在 \(n\) 个数中选出 \(a_i = x\) 的概率, 求 \(f(x)\) 表示钦定最终 \(\gcd(x_1, x_2, \cdots, x_k) = x\), 找到的形态所计算的概率与 \(k\) 的乘积之和
考虑 \(f(x)\) 还有更好的形式
我们需要考虑去重, 令正确的 \(f(x)\) 为 \(f_t(x)\)
这种形式是显而易见的
还有一个小问题, 期望应当是 \(\sum f(x) + 1\), 因为我们没有考虑 \(x_{k + 1}\) 同样带来 \(1\) 的贡献
现在我们处理每次概率空间变化的问题, 也就是每次取了数之后就把他拿出来
我们仍然采用形态法, 仍然考虑一个选择 \(x_1, x_2, \cdots x_k \mid x_{k + 1}\), 其中 \(\gcd(x_1, x_2, \cdots, x_k) \neq 1\), 而 \(\gcd(x_1, x_2, \cdots, x_k, x_{k + 1}) = 1\)
记 \(c(x)\) 表示 \(a_i = x\) 的个数, \(g(x)\) 表示钦定最终 \(\gcd(x_1, x_2, \cdots, x_k) = x\), 找到的形态所计算的概率与 \(k\) 的乘积之和
我们来分析一下处理的复杂度
等价于分析 \(\mathcal{O} \Big(\sum_{x \geq 1} C(x)\Big)\), 考虑每个数会在自己的因数处被计算一次, 而 \(v\) 的因数个数大概也就 \(\mathcal{O}(v^{\frac{1}{3}})\), 我们不难发现是 \(10^8\) 级别可以勉强接受
注意我们仍然要用相同的方法去重并统计进期望里
总结
\(\gcd(\alpha_i, \alpha_j) > 1\) 的本质是存在质数 \(x | \alpha_i, x | \alpha_j\) 且 \(x > 1\), 因此如果要求一堆数的 \(\gcd\) 大于 \(1\), 那么可以枚举存在的质因数/因数然后做判断
\(\sum_{i=1}^{k} iP^i(x)\) 可以转化成后缀和相加处理
关于 \(\gcd\) 的一种去重方法
尝试计算 \(x \mid \textrm{gcd}\) 的 \(\textrm{gcd}\) 个数从而计算出 \(x = \textrm{gcd}\) 的 \(\textrm{gcd}\) 个数, 具体来讲, 倒着处理, 每次删去当前考虑到的 \(\gcd\) 的倍数, 复杂度是 \(\mathcal{O} (V \ln V)\) 级别的