一类随机过程期望操作次数问题的常见解法
笑死,这标题太中二了,搞得像论文一样😅
Atcoder 式随机过程期望模板:
Given a ... of size . Snuke will repeatly do the following operation:
- Randomly choose a ... and ... .
Snuke terminates immediately when the following condition is satisfied: for each , ... .
Find the expected value of the number of operations she'll do, modulo .
在这类问题中我们通常关注的是操作序列的一些性质,例如某个数在操作序列中出现的次数不能超过多少;钦定某个数必须是操作序列的最后一个;等等。在一些更广泛的关心概率而不是操作次数的问题里,有时我们还可以忽略 “某个数在操作序列中出现的次数不能超过多少” 这个条件,而转化成对已经超过限制的数也一视同仁地放进操作序列中;有时还可以反过来,只关心操作序列里还没出现过的数,而把不停地选中出现过的数这一过程看作跳出当前状态的花费。
Part ? - 朴素的贡献拆分
要求到达合法状态的期望操作次数,通常可以拆成每个不合法状态的贡献来计算。具体说就是统计每个不合法状态到达的概率乘上跳出这个状态的期望时间之和。在题目的模型比较复杂不好规约的时候,通常可以采用这种方法来计算。它的劣势是复杂度非常高。
[ATC ABC242H] Random Painting
考虑一个不合法的状态是若干已选中的区间,满足这个集合内的区间不能覆盖全集。到达这个状态的概率、跳出这个状态的期望时间都和区间的个数有关。可以考虑 dp 出个数为 的不能覆盖全集的区间集合的个数,又能反过来变成求个数为 的覆盖了全集的集合个数。从左向右 dp,记录上一个还未覆盖的位置下标。讨论选中的右端点在这个位置的区间中最长的是哪一个就行了。
[LOJ 3042] 「ZJOI2019」麻将
这里把这道题贴出来只是为了说明这个题也是用这样的方法计算的。
Part I - 一种 GF 方法
这种方法通常用来求 “状态不单调” 而且终止状态情形统一的问题。所谓状态不单调,指的是一个合法状态有可能继续操作变成不合法。这种方法通过 GF 对症下药地直接消解了 “第一次合法” 的限制,从而使问题的难度大幅降低。
[ATC ARC136F] Flip Cells
令 OGF 为 表示从初始状态第一次到结束状态的方案数, 表示从结束状态第任意次到结束状态的方案数, 表示从初始状态任意次到达结束状态的方案数,则 ,并且消去了 “第一次” 的限制。
考虑求 或者 ,两者是本质相同的,这玩意儿是个 EGF。那么对每个位置都分操作奇数次和偶数次有不同贡献,分别是 和 。如果我们来 dp 考虑到第 行的多项式,那么看到 就很明白了,只要维护 前系数就可以了,这里 是目前为止的总的次数。
但是我们知道的是 EGF 的系数,现在我们要把 EGF 转成 OGF,我们考虑(为什么这啥比玩意儿也要单独开行间公式😅):
对应的 OGF 是 ,所以
我们现在要求 ,但是这跟答案有啥关系?其实 就是答案,而这玩意儿看起来眼熟,就是 。所以我们要求 ,我们真没必要实现多项式除法,所以就把 代入上下就行了。所以要关心分母为 的情况。首先 根据它的定义肯定不是 。看到上下的函数都是一堆 的和,如果 就会出事。这里我们这样干,把上下所有项都乘 ,就能规避掉这种情况。乘完之后再求导就是:
当 时为 ,否则为 。
[LOJ 3045] 「ZJOI2019」开关
还是一样的想法,考虑分别求出 “从全关到 ” 和 “从 到 ” 的 EGF,每个位置贡献的是 。因为对每个元素, 的分母都是一样的,所以把分母提到外面,然后背包出这个东西每一项的系数。然后就是和上面一样的问题了。
Part II - min-max 容斥
min-max 容斥基于这两个式子:
这里第二个式子里的 是期望, 是每一种可能的操作序列。符号都是我瞎 ✔8 乱起的。
min-max 容斥一般适用于状态单调且每个位置相对独立的情形,一般来说对每个位置都有一个合法条件,且合法之后会一直合法。这样比较方便对 “所有元素满足条件的最迟时间” 转化成 “最早满足条件的元素的时间”,然后再反,变成每个元素都不能满足条件,这样就把无限过程转化成有限过程了。
[UOJ 449] 【集训队作业2018】喂鸽子
考虑用 min-max 容斥转化成 “最早满足条件的元素的时间”,那么考虑每个元素都不能满足条件的每个状态,都需要 的期望时间跳出这个状态,并且每个状态被到达的概率都是 (我忏悔乱用符号; 是操作次数)。所以我们可以对每个元素都不满足条件的状态计数,它是
暴力背包多项式乘法是 就 TLE 了,考虑优化这东西,这个多项式快速幂是非常朴素的,直接 之后点值 次方,再 回来。这样复杂度变成 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探