ARC114E - Paper Cutting 2

Solution

考场上时间不够,没刚出来QAQ。

做法和官解本质相同,只是官解运用期望的线性性直接导出答案,而这里是对于所有方案统计贡献在除以方案数,从期望的定义上计算答案。可能稍显复杂。

Part one

我们要求的是合法操作序列的期望长度。

问题大概可以用一个类似《PKUWC2018猎人杀》的经典的套路转化为:
设有一个W+H−2W+H-2W+H−2条线组成的排列p1p2...pnp_1p_2...p_np1​p2​...pn​,其中pip_ipi​的贡献为111当且仅当不存在一个pj(j<i)p_j(j<i)pj​(j<i)可以把pip_ipi​叉掉,也就是说pip_ipi​前面没有一个能结束游戏或者把pip_ipi​的那一半白纸去掉的数,否则pip_ipi​贡献为000,一个排列的贡献是所有数的贡献和。

不难看出每个排列都映射到一组合法操作序列(即贡献为111的pip_ipi​序列),每个排列的贡献对应一组合法方案的长度,根据期望的定义(∑cipi\sum c_ip_i∑ci​pi​)容易证明上面所有排列的期望贡献和就是我们要求的合法方案的长度和。

Part two

因此我们想要求所有W+H−2W+H-2W+H−2条线的(W+H−2)!(W+H-2)!(W+H−2)!种排列的期望贡献,我们可以求出所有排列的贡献再除以方案数。

于是问题变成怎么求(W+H−2)!(W+H-2)!(W+H−2)!种排列的贡献和。

这里我们运用类似这场ARCARCARC的CCC题的方法,对于每个数,统计其对答案的贡献。也就是考虑这个数xxx会在多少个排列里贡献为111,即有多少个排列满足在xxx之前不存在能叉掉xxx的数。

设行的编号为1,2,...,H−11,2,...,H-11,2,...,H−1列的编号为1,2,...,W−11,2,...,W-11,2,...,W−1,不妨令w1<w2,h1<h2w_1<w_2,h_1<h_2w1​<w2​,h1​<h2​(显然这个顺序没有影响)。

先考虑列的贡献,分类讨论:

  • 若x<w1x < w_1x<w1​,则前面不能出现在[x,w1)∪[w1,w2)[x,w_1)\cup[w_1,w_2)[x,w1​)∪[w1​,w2​)中的数。
  • 若w1≤x<w2w_1 \leq x < w_2w1​≤x<w2​,则前面不能出现[w1,w2)[w_1,w_2)[w1​,w2​)中的数。
  • 若x>w2x > w_2x>w2​,则前面不能出现在(w2,x]∪[w1,w2)(w_2,x]\cup[w_1,w_2)(w2​,x]∪[w1​,w2​)中的数。

对于第一种情况,我们枚举xxx,再枚举它在排列中的位置,贡献即为:
∑i=1w1−1∑j=1W+H−2(W+H−2−((w2−1)−i+1)j−1)\sum_{i = 1}^{w_1-1}\sum_{j = 1} ^{W + H - 2}\binom{W+H-2-((w_2-1)-i+1)}{j - 1} i=1∑w1​−1​j=1∑W+H−2​(j−1W+H−2−((w2​−1)−i+1)​)
用上指标求和化简得:
∑j=1W+H−2(W+H−2−w2+w1j)−(W+H−2−w2+1j)\sum_{j = 1} ^{W + H - 2}\binom{W+H-2-w_2+w_1}{j}-\binom{W+H-2-w_2+1}{j} j=1∑W+H−2​(jW+H−2−w2​+w1​​)−(jW+H−2−w2​+1​)
这样就可以O(W+H)O(W+H)O(W+H)计算了。

第二种和第三种是类似的,行的贡献也是类似的,这里就不再赘述了。

总时间复杂度O(W+H)O(W+H)O(W+H)。

Code

实现上有一点点小细节。

//省略快读和头文件
int fac[MAXN], inv[MAXN];
inline int upd(int x, int y) { return x + y >= mods ? x + y - mods : x + y; }
inline int quick_pow(int x, int y) {int ret = 1;for (; y ; y >>= 1) {if (y & 1) ret = 1ll * ret * x % mods;x = 1ll * x * x % mods;}return ret;
}
inline int C(int x, int y) { return (x < y || y < 0) ? 0 : 1ll * fac[x] * inv[y] % mods * inv[x - y] % mods; }
void Init(int n) {fac[0] = 1;for (int i = 1; i <= n ; ++ i) fac[i] = 1ll * fac[i - 1] * i % mods;inv[n] = quick_pow(fac[n], mods - 2);for (int i = n - 1; i >= 0 ; -- i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mods;
}
int solve(int n, int h1, int h2, int w1, int w2, int W) {int ans = 0;if (w1 > 1)for (int i = 2; i <= n - h2 + h1 - w2 + w1 ; ++ i)ans = upd(ans, 1ll * fac[n - i] * fac[i - 1] % mods * upd(C(n - h2 + h1 - w2 + w1, i), mods - C(n - h2 + h1 - w2 + 1, i)) % mods);if (w1 < w2)for (int i = 2; i <= n - h2 + h1 - w2 + w1 + 1; ++ i)ans = upd(ans, 1ll * fac[n - i] * fac[i - 1] % mods * C(n - h2 + h1 - w2 + w1, i - 1) % mods * (w2 - w1) % mods);if (w2 < W)for (int i = 2; i <= n - h2 + h1 - w2 + w1 ; ++ i)ans = upd(ans, 1ll * fac[n - i] * fac[i - 1] % mods * upd(C(n - h2 + h1 - w2 + w1, i), mods - C(n - h2 + h1 - W + w1, i)) % mods);return upd(ans, 1ll * (W - 1) * fac[n - 1] % mods);
}
signed main() {#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifint H, W, h1, w1, h2, w2, n; read(H), read(W), read(h1), read(w1), read(h2), read(w2), n = H + W - 2;if (w1 > w2) swap(w1, w2);if (h1 > h2) swap(h1, h2);Init(n);printf("%lld\n", 1ll * inv[n] * upd(solve(n, h1, h2, w1, w2, W), solve(n, w1, w2, h1, h2, H)) % mods);return 0;
}

ARC114E - Paper Cutting 2(组合数学,概率与期望)相关推荐

  1. 【学习笔记】《概率与期望全家桶》(ACM / OI)概率与期望 / 概率论知识小结

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 这块知识很少,但是题很难- 目录 0x00 概率 0x01 基本概念 0x02 古典概率 0x03 条 ...

  2. 【学习笔记】信息学竞赛中的概率与期望小结

    信息竞赛--概率与期望 事件 事件的蕴含.包含 事件的互斥 事件的对立 事件的和(并) 事件的积(交) 事件的差 概率 事件的独立性 全概率公式 贝叶斯公式 概率DP(竞赛中的考察) 期望(竞赛中的考 ...

  3. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  4. 【学习小结】树上的概率、期望问题,树上高斯消元

    树上的概率和期望问题经常用到的思想是考虑父亲和孩子的转移关系 考虑父亲到孩子的概率或者期望通常需要先计算孩子到父亲的概率和期望 例题1 : 分别考虑每条边(两个方向)的贡献 在路径中每条边的贡献(走过 ...

  5. 概率与期望——P4316 绿豆蛙的归宿

    概率与期望--P4316 绿豆蛙的归宿 题目 算法分析 Code 反思与总结 题目 P4316 绿豆蛙的归宿 算法分析 要计算路径的总长度期望,可以将每一个结点看作一个阶段,用dpdpdp来实现.(看 ...

  6. 概率与期望——P1365 WJMZBMR打osu! / Easy

    概率与期望--P1365 WJMZBMR打osu! / Easy 题目 算法与分析 Code 反思与总结 题目 P1365 WJMZBMR打osu! / Easy 算法与分析 通过读题我们知道,有oo ...

  7. 概率与期望,成为预言家的第一步

    文章目录 参考文献 概率初解 期望 期望的定义与性质 期望定义 期望性质 证明性质 性质1 性质2 题目练习 例题 简单期望 概率DP 条件期望 题目 期望初练 二次期望 简单期望题 转化题目意思 三 ...

  8. 并不对劲的概率与期望

    并不觉得今天学到了什么东西-感觉像上了数学课一样- 很对劲的太刀流-> 一.枚举法 初二数学就有提到的.不过,有时算出的概率和直觉并不相符,所以并不能直接凭感性认识,并不对劲的人有时还得理性分析 ...

  9. Crossing Rivers UVA - 12230 概率与期望

    题目大意: 有个人每天要去公司上班,每次会经过N条河,家和公司的距离为D,默认在陆地的速度为1, 给出N条河的信息,包括起始坐标p,宽度L,以及船的速度v.船会往返在河的两岸,人到达河岸时, 船的位置 ...

最新文章

  1. SpringMVC调用接口一直乱码
  2. 12、Kubernetes核心技术Ingress
  3. java 容器_Java容器框架学习整理
  4. 将webstorm设置为eclipse风格
  5. vue 登录模板_不用自己搭建后台模板,使用这个就够了
  6. java8 stream遍历_Java8新特性:Stream流详解
  7. 关于地理信息系统(GIS)的几个问题
  8. HarmonyOS之应用开发的电话服务与蜂窝网络
  9. quantum_如何从Firefox Quantum删除Pocket
  10. Vue 凭什么成为 2020 年的一匹黑马
  11. 百度之后,电子银行还安全么?
  12. 为什么要给计算机配置IP地址,更改ip地址 为何要重启电脑
  13. 代码整洁之道的一些总结
  14. AutoIt自动化编程(4)【转】
  15. 查看一个数是不是2的n次方
  16. URL地址编码和解码
  17. 值得关注的5款低代码平台推荐
  18. CRNN原理详解、代码实现及BUG分析
  19. 如何越过计算机开机密码,怎样跳过电脑开机密码教程
  20. 阳历和农历互相转换的js代码

热门文章

  1. 陪孩子看完这几部高分纪录片,胜过出国亲子游!
  2. 这些肢体语言竟然是这个意思! | 今日最佳
  3. 干货|MIT线性代数课程精细笔记[第二课]
  4. Java类集-SortedSet接口
  5. 《SAS编程与数据挖掘商业案例》学习笔记之二
  6. activiti5.9 mysql_Activiti5.9换成MySQL数据库
  7. 备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享
  8. 计算机 运行命令,教你电脑运行命令
  9. android view存储为jpg,Android长按imageview把图片保存到本地的实例代码
  10. 计算机技术题目,计算机技术题目.doc