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

ARC114E - Paper Cutting 2

Solution

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

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

Part one

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

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

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

Part two

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

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

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

设行的编号为1,2,...,H−11,2,...,H-11,2,...,H1列的编号为1,2,...,W−11,2,...,W-11,2,...,W1,不妨令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_2w1x<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=1w11j=1W+H2(j1W+H2((w21)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=1W+H2(jW+H2w2+w1)(jW+H2w2+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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8个月打磨,一份送给程序员的「分布式系统」合集

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「75」篇原创敬上整理好的文章目录在文末&#xff0c;可直接拉到最后是的&#xff0c;这份礼物最佳受众是程序员。但是&#xff0c;如果你不是程序员&#xff0c;相信这些能使你…

HDU - 6071 Lazy Running 同余最短路 + 分层

传送门 题意&#xff1a; 给定四个点构成一个环&#xff0c;给出四个点之间的距离&#xff0c;让后从222号点出发&#xff0c;最终回到222号点&#xff0c;求经过的距离>k>k>k的最小距离。 思路&#xff1a; 由于从222开始&#xff0c;最终在222结束&#xff0c;所以…

CF1398F

CF1398F Solution 我又来贡献暴力做法了。。。听说两只log不可能过1e6? 有一个显然的想法是&#xff1a; 我们先预处理一个aia_iai​表示第iii个位置的最长后缀长度&#xff0c;满足该后缀中不同时存在0和1。 假设我们要求xixixi的答案&#xff0c;那么一个位置jjj可以作…

【翻译】无需安装Python,就可以在.NET里调用Python库

原文地址&#xff1a;https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/pythonnet这个屌爆的项目的出现&#xff0c;使得我们可以用一种新的方式&#xff0c;让C#可以和Python之间进行互操作。但是它的设置和部署可能有点…

Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

传送门 题意&#xff1a; 给你一个nmnmnm的矩阵&#xff0c;其中包含字符′.′.′.′和′X′X′X′&#xff0c;你可以将任何′.′.′.′改成′X′X′X′&#xff0c;现在问你能否通过修改一些′.′.′.′来使′X′X′X′联通且不存在环。保证原本的′X′X′X′没有任何两个相…

CF1067E Random Forest Rank(树形dp,概率与期望,线性代数)

CF1067E Random Forest Rank Solution 考虑树的邻接矩阵的秩的意义&#xff0c;不难发现相当于每个点找一个“代表”&#xff0c;对于一个点xxx&#xff0c;它的“代表”为一个与xxx相邻的结点&#xff0c;要求保证所有点的“代表”不重复&#xff0c;求能找到“代表”的点的…

Ocelot(六)- 架构图

简介Ocelot是一个用.NET Core实现并且开源的API网关&#xff0c;它功能强大&#xff0c;包括了&#xff1a;路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、k8s 集成。这些功能只都只需要简单的配置即可完成。架构图Ocelot的目标是使用…

P5170 【模板】类欧几里得算法(类欧)

P5170 【模板】类欧几里得算法 Description 要求在O(lgn)O(lgn)O(lgn)的时间内求出&#xff1a; ∑i0n⌊aibc⌋\sum_{i 0}^n{\lfloor\frac{aib}{c}\rfloor}∑i0n​⌊caib​⌋ ∑i0ni⌊aibc⌋\sum_{i 0}^n{i\lfloor\frac{aib}{c}\rfloor }∑i0n​i⌊caib​⌋ ∑i0n⌊aibc⌋2…

AtCoder Beginner Contest 192 F - Potion 背包dp

传送门 题意&#xff1a; 给你nnn个数&#xff0c;让后让你选出来kkk个AAA&#xff0c;把他们求和&#xff0c;之后再递增kkk直到正好达到xxx&#xff0c;求最小的递增次数。 思路&#xff1a; 转化一下题意就是求∑Ax(modlen)\sum Ax(\bmod\ \ len)∑Ax(mod len)&#xff0…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法开源地址 https://github.com/liningit/LnskyDB在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如…

P4887 【模板】莫队二次离线(第十四分块(前体))

P4887 【模板】莫队二次离线&#xff08;第十四分块(前体)&#xff09; Solution 简单学习了一下二次离线莫队&#xff0c;写了个板子题。 这题直接莫队时间复杂度为O(Cnn)O(Cn\sqrt n)O(Cnn​)&#xff0c;其中C(14k)C\binom{14}{k}C(k14​)&#xff0c;显然不太行。 我们…

P1297 [国家集训队]单选错位 期望

传送门 题意&#xff1a; 思路&#xff1a; 手推了一下没想到还真的能过。 对于相邻的两个数aia_iai​和ai1a_{i1}ai1​&#xff0c;分两种情况讨论&#xff1a; (1) ai<ai1a_i<a_{i1}ai​<ai1​ 时&#xff0c;答案在[1,ai][1,a_i][1,ai​]的范围内概率为aiai1\fra…

也读《人月神话》:没有银弹的软件工程

一、关于人月神话这本书记得在上大学的时候&#xff0c;就经常听学长和老师讲起《人月神话》&#xff0c;但是却一直没有阅读。记得当时一听到这个书名&#xff0c;还以为是个神马科幻类别的书&#xff0c;结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父…

CF1088F. Ehab and a weird weight formula(倍增)

CF1088F. Ehab and a weird weight formula Solution 这题大概是个大力找性质题&#xff08;莫名感觉学习文化课有利于找性质&#xff1f;&#xff01;&#xff1f;&#xff09;。 性质1&#xff1a;不难发现一个点比它权值小的有且仅有一个&#xff08;最小权点除外&#x…

P6154 游走 概率dp

传送门 题意&#xff1a; 思路&#xff1a; 给你个DAGDAGDAG&#xff0c;由于每一条路径出现概率相等&#xff0c;那么期望就是总长度路径个数\frac{总长度}{路径个数}路径个数总长度​。设f[i]f[i]f[i]表示到iii这个点的总长度&#xff0c;g[i]g[i]g[i]表示到iii这个点路径的…

[译]如何在C#中调试LINQ查询

LINQ是我在C#中最喜欢的功能之一。它让代码看起来更漂亮美观。我们得到了一个易于编写和理解的简洁函数式语法。好吧&#xff0c;至少我们可以使用LINQ方法的语法风格。LINQ很难进行调试。我们无法知道该查询内部发生了什么。我们可以看到输入和输出&#xff0c;但这就是它的全…

CF1303F - Number of Components(并查集)

CF1303F - Number of Components Solution 思路还是有点妙的。 容易想到并查集&#xff0c;但是并查集不容易维护删边&#xff0c;怎么办呢&#xff1f; 我们考虑拆贡献&#xff0c;把加边的贡献和删边的贡献拆开&#xff0c;分别维护。 只加边就是四连通加边&#xff0c;算…

CodeForces - 375D Tree and Queries 树启 + 思维

传送门 题意&#xff1a; 思路&#xff1a; 很明显子树问题会想到树启&#xff0c;让后如何updateupdateupdate呢&#xff1f;一个显然的思路就是维护一个树状数组&#xff0c;查询次数>kj>k_j>kj​的个数。但是这样复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)的&#xf…

WebSocket数据加密——AES与RSA混合加密

前言之前在写“一套简单的web即时通讯”&#xff0c;写到第三版的时候没什么思路&#xff0c;正好微信公众号看到一篇讲API交互加密&#xff0c;于是就自己搞了一套AES与RSA混合加密&#xff0c;无意中产生应用在WebSocket想法&#xff0c;好在思路都差不多&#xff0c;稍微改动…

CF1365G Secure Password(构造,交互,二进制分组)

CF1365G Secure Password Solution 妙妙思维题。 注意到(136)>n\binom{13}{6}>n(613​)>n。&#xff08;谁tm能注意到这个&#xff1f;&#xff01;&#xff1f;&#xff09; 我们可以把所有13位二进制数中有6个1的拿出来给nnn个数重标号。然后对于每一位iii&…