zoukankan      html  css  js  c++  java
  • CF1349 部分题解

    恭喜 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 e j}left(max(e_i, e_j) ight))。如果按照 (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 e j] p_jcdot f_0 ight))。式子中出现 (f_0) 是因为 (j) 获胜时 (i) 一定一块饼干也没有,也就是一个 (0) 块饼干的人最后拥有所有饼干的期望时间。

    对上面的等式两边分别对 (i={1, 2, ldots, n}) 求和,得到 (sum_{i=1}^n f_{a_i}=nsum_{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),移项得到:(ncdot 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) 的排列和每一个 (iin[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}inom{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)!{jrace j-i+1})。注意这里硬点的位置可以由每种方案里每个集合的球个数推出来,因此不需要再乘。显然 (f)(g) 是可以二项式反演的,我们得到 (f_{j, i}=sum_{k=i}^j g_{j, k}inom{k-1}{i-1}(-1)^{k-i})

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

    [egin{aligned}operatorname{ans}_i&=sum_{j=1}^n f_{j, i}inom{n}{j}(n-j)!\&=sum_{j=1}^n frac{n!}{j!} sum_{k=i}^j g_{j, k}inom{k-1}{i-1}(-1)^{k-i}\&=sum_{k=i}^n inom{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 吗(

  • 相关阅读:
    PHP的语言规范
    Js 中的this
    Js 事件
    Js DOM 操作
    Js DOM对象
    Js 对象三
    Js 定时器
    Js 对象二
    Js 对象
    POJ 2987 Firing(最大流最小割の最大权闭合图)
  • 原文地址:https://www.cnblogs.com/suwakow/p/12899872.html
Copyright © 2011-2022 走看看