Loading

sto 锂铀铱 orz

Hello World

蓝书数学

P4778 Counting swaps

容易想到找出置换。然后就不会了。猜了一下,以为一个大小为 \(x\) 的置换环的方案数为 \(\frac{x!}{2}\),因为我以为每一步都只能选了相邻的两个数进行交换。

实际上同一个环上任意两个位置都可以进行交换。交换之后,一个环会变成两个环。设 \(f_i\) 为大小为 \(i\) 的环的方案数,可以进行递推:

\[f_{i}=\sum_{j=1}^{\lfloor\frac{i}{2}\rfloor}k\binom{i-2}{j-1}f_{i-j}f_{j} \]

其中 \(k\)\(2j=i\) 时,为 \(\frac{n}{2}\),否则为 \(n\)。即当前交换的两点的选择方案数。

这样递推复杂度不对,打表观察 \(f\)或者直接打开题解 可以发现 \(f_{i}=i^{i-2}\),这样可以优化到 \(O(n)\)。具体证明的话 我懒得看 大概是考虑在每一种方案与有标号无根树之间建立双射。

P2480 [SDOI2010] 古代猪文

数论大集合题。ExLucas = ExCRT + Lucas = ExGCD + Lucas + ?.

列出式子是求 \(\sum_{k\mid n}g^{\binom{n}{k}}\pmod{\text{p}}\),由欧拉定理得 \(\sum_{k\mid n}g^{\binom{n}{k}\bmod{p-1}}\pmod{p}\),只要在合理时间内求出 \(\binom{n}{k}\bmod{p-1}\) 即可。由于题目给出的模数的特殊性:\(999911659-1=2\times 3\times 4679\times 35617\),于是可以直接 ExLucas 即可。

CF451E Devu and Flowers

本质上是求多重集的本质不同子集数量。容斥 + 插板法。

概率期望 DP

* CF804D Expected diameter of a tree

感觉挺神奇,实际上跟期望没有关系。考虑连接直径为 \(x\)\(y\) 的两棵树上的两个点 \(a\)\(b\) 的贡献,假设 \(a\)\(b\) 到树上最远距离为 \(d_a\)\(d_b\),那么贡献为 \(\max(x,y,d_a+d_b+1)\)。考虑当取到 \(d_a+d_b+1\) 一项时,有 \(d_a+d_b\ge \max(x,y)\),移项得到 \(d_a\ge \max(x,y)-d_b\)。预处理 \(d_a\) 的后缀数量和后缀和,可以在 \(\min(sz_a,sz_b)\) 的时间内求出答案。

既然是 \(\min\),那不得不想到经典的阈值分治。设 \(B=\sqrt{n}\),当其中一棵树大小不超过 \(B\) 时,直接求就可以了。如果两棵树大小都超过 \(B\),可以预处理答案。

** P3239 [HNOI2015] 亚瑟王

很厉害呀。我没想出来。

由期望的线性性,可以将每个卡牌分开考虑,求出每一个卡牌的概率乘上伤害值。

考虑第一个卡牌,被选中的概率显然是 \(1-(1-p_1)^{r}\),因为它是第一张,不需要考虑别的卡牌的影响。

第二个卡牌有两种情况:1.第一张卡牌没选中,那么概率也是 \(1-(1-p_2)^{r}\)。2.第一张卡牌选中了,那么在第一张卡牌选中那一轮,第二张卡牌不能选,剩下的都可以选,那么概率是 \(1-(1-p_2)^{r-1}\)

这启示我们,每一个卡牌的概率只会受编号在这张卡牌前选了几张卡牌影响。例如选了 \(j\) 张,那么这 \(j\) 轮不需要考虑,只用考虑剩下的 \(r-j\) 轮,而这些轮中,有其中一轮选择的概率显然是 \(1-(1-p_i)^{r-j}\)。只受编号更小的卡牌的影响,所以可以划分阶段。

\(f_{i,j}\) 表示前 \(i\) 张卡牌选择了 \(j\) 张的概率,那么容易转移。

** P3750 [六省联考 2017] 分手是祝愿

好厉害。显然每个开关只有操作和不操作两种情况。首先我发现了一种操作方案是:从 \(n\)\(1\) 顺序考虑每个开关,如果灯 \(i\) 是亮的,就操作开关 \(i\)。这样必定可以在 \(n\) 步以内操作完成。到这里我就没有更多头绪了。

实际上这一种操作方式是最优操作方式,因为每一个开关的操作不可以被其它的开关的操作的组合所取代。所以可以先统计出最少的操作次数 \(cnt\)。考虑前面的随机操作的过程,如果操作到一个不应该被操作的开关,就需要再将这个开关操作一次,以抵消影响。

设 DP 状态 \(f_i\) 表示剩余需要操作的开关有 \(i\) 个,变成 \(i-1\) 个的期望步数。则有转移 \(f_i=\frac{i}{n}\times 1+\frac{n-i}{n}\times (f_{i+1}+f_i+1)\),即如果恰好操作到需要操作的,则一步完成;否则需要先从 \(i+1\) 个变成 \(i\) 个,再从 \(i\) 个变成 \(i-1\) 个。

最后,若 \(cnt\le k\),则答案就为 \(cnt\),否则答案为 \(\sum_{i=k+1}^{cnt}f_i+k\)

** P3412 仓鼠找sugar II

想起来前段时间模拟赛的第一题,也是类似的树上游走,想到可以用性质二的做法,但是还是不会做。

利用期望的先行性,求出每一条边的贡献再相加即为答案。由于对于一条边 \((u,v)\),从 \(u\)\(v\) 和从 \(v\)\(u\) 的期望步数并不相同,将每条边拆成两条单向边。一条有向边的贡献即为两边点数乘积乘上期望步数。

问题转化为求每一条边的期望步数。考虑模拟赛那题的做法:树形 DP,随意定根,设 \(f_i\) 表示从 \(fa_i\) 走到 \(i\) 的期望步数,设 \(g_i\) 表示从 \(i\) 走到 \(fa_i\) 的期望步数。设点 \(i\) 的度数为 \(d_i\),则可列出方程:

\[g_i=1+\sum_{j\in \text{son}(i)}\frac{1}{d_i}\times (g_j+g_i) \]

\[f_i=1+\frac{1}{d_{fa_i}}\times (f_{fa_i}+f_i)+\sum_{j\in\text{son}(i)}\frac{1}{d_{fa_i}}\times(g_j+f_i) \]

进行一些恒等变形可以得到 \(g\)\(f\) 的表达式,树形 DP 求出 \(g\)\(f\) 后答案可求。

** P3317 [SDOI2014] 重建

给定一个无向完全图的每一条边的出现概率,求出现一棵生成树的概率。

第一眼,这不就是矩阵树定理模板吗?打开题解一看发现不是,因为矩阵树定理求的是 \(\sum_{E}\prod_{e\in E}p_e\),但是实际要求的是 \(\sum_{E}\prod_{e\in E}p_e\prod_{e\not\in E}(1-p_e)\),那就不能直接套模板。

题解教我进行转化,设 \(P=\prod_{e\in G}(1-p_e)\),则要求的变成 \(P\sum_{E}\prod_{e\in E}\frac{p_e}{1-p_e}\),这就变成矩阵树定理的标准形式,可以求解。

然而有一个问题,\(p_e\)\(1\) 的时候会出现分母为 \(0\) 的情况。但是由于题目是浮点数,直接给 \(p_e\) 加上一个 \(\text{eps}\),答案仍然较为准确,并且不会出现除以 \(0\) 的问题。

** P3830 [SHOI2012] 随机树

连第一问都想不出来,想了个复杂的东西还不知道对不对。

第一问设 \(f_i\) 表示 \(i\) 个叶子的答案。那么有 \(f_i=\frac{f_{i-1}\times (i-1)+(f_{i-1}+2)}{i}\),化简得到 \(f_i=f_{i-1}+\frac{2}{i}\)

第二问由于是整棵树的深度,比较麻烦。考虑经典做法:对于每个 \(i\),求大于等于 \(i\) 的概率,概率之和即为期望。比如一棵树深度为 \(3\),则会在大于等于 \(1\) 时贡献一次,大于等于 \(2\) 时贡献一次,大于等于 \(3\) 时贡献一次,总共贡献三次,符合期望的定义。

\(f_{i,j}\) 表示 \(i\) 个叶子的树,深度大于等于 \(j\) 的概率,则 \(f_{i,j}=\sum_{k=1}^{i-1}\frac{1}{i-1}(f_{i-k,j-1}+f_{k,j-1}-f_{i-k,j-1}\times f_{k,j-1})\),即两边概率之和,减去算重的部分。

但是有一个问题,为什么这里能够乘 \(\frac{1}{i-1}\)?这暗示了对于所有 \(i-1\) 种左右子树叶子数量分配方案,其随机树的数量相同。

对于左儿子 \(k\) 个叶子,右儿子 \(i-k\) 个叶子的情况,考虑共有 \(i-1\) 次操作,第一次必定是分裂根节点,后面每一次可以选择分裂左子树或是右子树,则方案数为 \(\binom{i-2}{k-1}\),即 \(\frac{(i-2)!}{(i-k-1)!(k-1)!}\)

然后考虑具体操作:显然题目中一棵 \(i\) 个叶子的随机树有 \((i-1)!\) 种,故左子树有 \((k-1)!\) 种树,右子树有 \((i-k-1)!\) 种树,乘上 \(\frac{(i-2)!}{(i-k-1)!(k-1)!}\),发现总方案数有 \((i-2)!\) 种。

也就是说,当左右子树中叶子的数量确定时,树的形态都有 \((i-2)!\) 种,所以方案数相同。

* P4284 [SHOI2014] 概率充电器

显然期望为每一个点的概率之和。考虑树形 DP 求根节点概率,然后换根求其它点的概率,设 \(f_i\) 表示以 \(i\) 为根的子树的答案。由于可能多个儿子都可以贡献,可能算重,所以可以规定一个顺序,使得在多个儿子贡献时,在顺序最靠前的儿子处计算贡献。

换根其实并不非常困难。

P4853 yyf hates dagequ

感觉题面写的不好,让人比较难看懂。

这题其实挺简单,属于下位紫或蓝。很容易注意到下一步判定只与当前的部分信息有关,将这些信息设入状态中就可以了。但是卡牌的效果不能每一次重新计算,需要先进行预处理。可以使用技巧:如果有多个事件同时发生,给这些事件规定一个顺序,取最前发生的事件为代表计算发生概率。

因为 sort 重载运算符时没有注意到不能让 \(a\lt b\)\(b\lt a\) 同时成立,RE 了,好久都没发现。

* P5516 [MtOI2019] 小铃的烦恼

首先发现题目给的 \(p\) 是诈骗。然后很容易想到枚举一个目标属性,然后剩下的过程只关心目标属性和非目标属性的数量。设 \(f_i\) 表示现在有 \(i\) 个目标属性的期望步数。转移容易得到:

\[f_{i}=\frac{i(n-i)}{n(n-1)}f_{i-1}+\frac{i(n-i)}{n(n-1)}f_{i+1}+(1-\frac{2i(n-i)}{n(n-i)})f_{i}+v_i \]

其中 \(v_i=\frac{i}{n}\),表示最后得到的属性是这 \(i\) 个的属性的概率。一开始我以为 \(v_i=1\),怎样都过不了样例,看了题解才知道应该这样设,因为不能保证所有情况,都是最后这 \(i\) 个的属性是目标属性。这个 \(v_i\) 的推导和 \(f_i\) 是相似的,可以解出 \(v_i=\frac{i}{n}\)

然后就是高斯消元了,每行只有三个数,是经典的优化版高斯消元,可以 \(O(n)\) 完成。这里我偷懒了,直接 \(O(n^2)\)_

posted @ 2025-03-25 17:23  Terminator-Line  阅读(21)  评论(0)    收藏  举报