首页 > 技术文章 > CF1349 部分题解

suwakow 2020-05-16 12:22 原文

恭喜 tourist 喜提 top rated rk4(

连续两场 rated 都是 Chinese Round,tourist 有苦难言(

所以咕了好几天的(部分)题解终于来了(

  • A

对每个质数 \(p\) 分别考虑,假设 \(p\)\(a_i\) 中出现了 \(e_i\) 次,那么它对 \(\operatorname{lcm}(a_i, a_j)\) 的贡献就是 \(p^{\max(e_i, e_j)}\)。对所有 \(\operatorname{lcm}(a_i, a_j)\)\(\gcd\) 时,实际上的贡献是 \(\min_{i\ne j}\left(\max(e_i, e_j)\right)\)。如果按照 \(e_i\) 排序的话,显然会取到第二小的。注意如果 \(p\) 出现了 \(0\) 次,也要算进去。

可以对每个 \(a_i\) 暴力求质因子,实际操作时先用 \(e_i\)\(0\) 的个数判断,非 \(0\) 个数 \(\geq n-1\) 时贡献才不为 \(p^0\)

  • B

首先 \(k\) 不存在时显然无解。否则不难发现,如果存在 \(a_i=k, a_{i+1}\geq k\)(或者调换过来),总可以把序列变成全 \(k\),因此考虑尽可能地增大 \(\geq k\) 的数的数量(在不减少 \(k\) 的前提下)。

实际上,如果把 \(<k\) 的看作 \(0\)\(\geq k\) 的看作 \(1\),那么整个序列如果存在一个长度为 \(2\)\(3\) 的子区间的和 \(>0\),则一定有解(从这样的子区间不断向外每次拓展一个单位即可);否则必然无解,因为这样任取一个子区间,它的中位数都 \(<k\)\(\geq k\) 的数不会变多。

这题实际上很少有人 FST,但是我手贱 hack 了一发 \(-1\),然后差点掉分(

  • C

可以发现,一个格子会在下一秒变色的充要条件是它所在的同色连通块大小 \(\geq 2\)。因此,把所有 \(\geq 2\) 的同色作为起点开始 bfs,可以求出每个格子最早开始变色的时间(如果某个格子在 \(0\) 时刻不变色,那么它周围的格子一定都与它异色,它一定会在周围至少有一个格子变色的下一个时刻变色)。于是就可以 \(O(1)\) 回答询问了,注意没有起点的情况。

  • D

tourist 惨遭安排的神仙题(我当然也不会x

很多人可能做过一个更简单的题目:每次随机取两个饼干,以各 \(\frac{1}{2}\) 的概率将其中一个饼干交给另一个饼干的主人。这个题目和本题最大的区别在于,由于每个人只要饼干数目变为 \(0\) 就不可能再拥有任何饼干,可以发现对于一个拥有 \(x\) 个饼干的人来说,他最后获得全部饼干的概率只和 \(x\) 以及饼干的总数 \(m\) 有关,和其他所有因素(其他人的饼干分布等)完全无关。不难推出,这个概率就是 \(\frac{x}{m}\)

实际上,类比一下上面的问题,对于本题,有一样东西是我们可以直接求的:每个人第一次拥有所有饼干的期望时间。但是它和答案并没有直接关系,因为这是对于每个人来说的第一次,而答案要求的是全局的第一次。实际上,由于这里假设不存在了 “某人第一次获得全部饼干时” 游戏结束(不妨称作某人获胜)这个条件,每个人第一次获得全部饼干的时间也都只和 \(x, m\) 有关。设它为 \(f_x\),我们先假设求出了它,看看能对答案产生什么影响。

\(p_i\) 表示第 \(i\) 个人获胜的概率,\(g_i\) 表示第 \(i\) 个人获胜的期望时间乘以 \(p_i\)。对于 \(f_{a_i}\),可以枚举这一次游戏实际获胜的人,得到等式:\(f_{a_i}=\sum_{j=1}^n g_j+\left([i\ne j] p_j\cdot f_0\right)\)。式子中出现 \(f_0\) 是因为 \(j\) 获胜时 \(i\) 一定一块饼干也没有,也就是一个 \(0\) 块饼干的人最后拥有所有饼干的期望时间。

对上面的等式两边分别对 \(i=\{1, 2, \ldots, n\}\) 求和,得到 \(\sum_{i=1}^n f_{a_i}=n\sum_{j=1}^n g_j+(n-1) p_j \cdot f_0\)。发现 \(\sum_{j=1}^n g_j\) 就是我们所求的答案,且 \(\sum_{j=1}^n p_j=1\),移项得到:\(n\cdot \mathrm{ans}=(n-1) f_0-\sum_{i=1}^n f_{a_i}\)。居然只需要简单的推导,就可以用易于计算的 \(f\) 来线性表示出答案!

最后的问题是如何算 \(f\)。注意到 \(f_i\) 可以从 \(f_{i-1}, f_i, f_{i+1}\) 分别转移,但是传统的高斯消元不仅推导过程繁琐,而且会出现分母是模数的倍数的尴尬情况。实际上,可以将 \(f\) 差分,令 \(g_i=f_{i+1}-f_i\),再根据 \(g\) 的实际意义列式转移,会发现它只从 \(g_{i-1}, g_i\) 转移,又因为 \(g_0=m-1\),可以简洁优美地直接推到 \(g_{m-1}\),并且过程中的分母只有 \(m-i\) 一项,不会出现模数的倍数。

  • E

什么,你觉得我会做 \(3500\) 吗(

  • F1

tourist 惨遭安排的神仙题(然而 Div.2 居然有人过了 F1……)

首先有一个至关重要,并且我也不知道怎么看出来的观察:所有长度为 \(n\) 的 “好的” 序列,都和一个长度为 \(n\) 的排列一一对应。

对于一个排列 \(a\),可以在它的每两个元素之间插入一个 <>,对于 \(a_i\),生成的 “好的” 序列 \(p\)\(p_{a_i}\) 的位置的值是 \(a_1, a_2, \ldots, a_i\) 之间的 < 的数量 \(+1\)。这样看起来比较绕,实际上它的意思是,对于排列中连续上升的极长的一段,把这一段的值作为下标,在 \(p\) 里的值是相同的,都等于从 \(a_1\) 到它们为止的连续上升的段数。设 \(a_i<a_{i+1}\),那么 \(p_{a_{i+1}}=p_{a_i}+1\),恰好满足题目里对 “好的” 的定义。由此也可以看出,对于一个 \(p\),我们也能唯一还原出排列 \(a\):将值相同的位置拿出来,它们是一个连续上升的段,因此在 \(a\) 中的排列方式是固定的。

现在的问题其实是,对于每一个长度为 \(n\) 的排列和每一个 \(i\in[1, n]\),统计 \(a_j\) 的数量,使得 \(a_1, a_2, \ldots, a_j\) 中恰好有 \(i-1\)<。设长度为 \(j\) 的排列,\(a_1, a_2, \ldots, a_j\) 中恰好有 \(i-1\)< 的个数为 \(f_{j, i}\),由于排列中后面的 \(n-j\) 个元素可以任意安排,不难发现它对 \(\operatorname{ans}_i\)(即 \(i\) 在 “好的” 序列里出现的总次数)的贡献为 \(f_{j, i}\binom{n}{j}(n-j)!\),只需要对每个 \(i\) 枚举 \(j\) 算贡献即可。

还有一个问题是如何求 \(f_{j, i}\)。设 \(g_{j, i}\) 表示长度为 \(j\) 的排列,硬点了 \(i-1\)< 的方案数。假如确定了这些被硬点的 < 的位置,那么对于一段连续的 <,假如确定了安置在这些 < 周围的元素的集合,会发现只有一种放法。换句话说,把每个未被硬点的位置看做一个隔板,它们把排列分为了恰好 \(j-i+1\) 个集合,方案数就是将 \(j\) 个有标号球放进 \(j-i+1\)有标号集合的方案数,即 \((j-i+1)!{j\brace j-i+1}\)。注意这里硬点的位置可以由每种方案里每个集合的球个数推出来,因此不需要再乘。显然 \(f\)\(g\) 是可以二项式反演的,我们得到 \(f_{j, i}=\sum_{k=i}^j g_{j, k}\binom{k-1}{i-1}(-1)^{k-i}\)

还有一个问题是,如果暴力计算 \(f_{j, i}\),复杂度是 \(O(n^3)\) 的,即使用 ntt 优化也是 \(O(n^2\log n)\) 的,很难通过。但是将 \(\operatorname{ans}_i\) 的表达式列出来,可以进行一番推导:

\[\begin{aligned}\operatorname{ans}_i&=\sum_{j=1}^n f_{j, i}\binom{n}{j}(n-j)!\\&=\sum_{j=1}^n \frac{n!}{j!} \sum_{k=i}^j g_{j, k}\binom{k-1}{i-1}(-1)^{k-i}\\&=\sum_{k=i}^n \binom{k-1}{i-1}(-1)^{k-i}\sum_{j=k}^n \frac{n!}{j!} g_{j, k}\end{aligned} \]

发现内层求和只与 \(k\) 有关,因此只需要对每个 \(k\) 预处理出内层求和的值即可,\(g_{j, k}\) 可以预处理阶乘及其逆元、斯特林数后 \(O(1)\) 计算,总复杂度是 \(O(n^2)\) 的。

  • F2

什么,你觉得我会拉格朗日反演和多项式 exp 吗(

推荐阅读