Codeforces Round 1007 (Div. 2) ABCE
2071A - The Play Never Ends
题解
三人的排列方式实际是唯一的。
1 |
|
2071B - Perfecto
题解
不止 1 无解,例如,8 也无解。需要判断有无解,并避免出现这样的前缀。
可以构造,把 1 2 交换,8 9 交换……
记得开 long long。
1 |
|
2071C - Trapmigiano Reggiano
方法一
直观感受,需要把老鼠逼到起点到终点的路径上,应该先操作离路径远的,再操作离路径近的,这样尽管先拉远了最后也能拉回来。
依次考虑从起点到终点的路径(鱼的脊骨)上每个点,再考虑 子树(也就是鱼的侧刺)上的所有点,将这些点按深度从深到浅输出。
为什么是对的呢,对于这个点,操作完深度 的节点后,老鼠的深度必定,这样最终老鼠位于 点。按路径操作后,老鼠就在终点了。
1 |
|
方法二
实际上和路径没什么关系,目标是把老鼠逼到终点,所以以终点为根, 将所有点按深度从深到浅输出即可。仍然是操作完深度 的节点后,老鼠的深度必定,最终老鼠位于根。
1 |
|
2071E - LeaFall
以下把题目中的 记作,落下的概率是,没落下的概率是。
拆解问题
某一个点成为叶子的条件及概率
这个点只能连一条边,也就是他邻居中除了一个点外都落下。当然,自己也不能落下。
比如它有三个邻居 123,那么成为叶子的概率就是,化简得。记。
1 | vector<Z> prod(n, 1); |
题目要求两个点,什么时候两个点相互独立,都是叶子概率是多少?
刚才提到,一个点能否是叶子只与它自己和它的邻居有关。若要求相互独立,那 就不能有共同的邻居,也就是说,这两个点的距离至少为 3。
相互独立,概率就好算了,两两的 之积再求和。
这里先不管是否独立,一股脑都加上,等后面再修正。
1 | Z sum = 0; |
如果两个点相邻,都是叶子概率是多少?
这两个点都不能落下,所以其他邻居都要落下。概率是。
1 | for (auto [u, v] : edge) { |
如果两个点距离为 2(隔一个点 x),都是叶子概率是多少?
从刚才相互独立的情形考虑,我们多算了哪些情形?是 认为 没有掉落( 成为叶子的前提是 没有掉落),而 认为 掉落了。需要把这种情况的概率减掉。
认为 没有掉落的概率是,认为 掉落的概率是。
那么上述情况的概率是。
1 | Z sum = 0; |
做到这里还不对。
和 都认为 掉落时也有一些小问题,我们把 掉落的概率算了两边,需要除掉一个。也就是减去错误的 再加上正确的。
和 都认为 没有掉落时也时同理。
1 | Z sumstay = 0; |
1 | using Z = ModInt<998244353>; |