Loading

[ZJOI2019] 麻将 解题报告

简要题意:

一副麻将有数字牌 \(1\sim n\)\(4\) 张,定义 \((i,i)\) 为对子,\((i-1,i,i+1)\) 为顺子,\((i,i,i)\) 为刻子,面子是指顺子或者刻子,定义 \(14\) 张牌组成的集合是胡的,当且仅当其满足两个条件之一:

  1. 可以划分成集合 \(S_1,S_2,S_3,S_4,S_5\),使得 \(S_1\) 是对子,\(S_2,S_3,S_4,S_5\) 是面子。

  2. 可以划分成两两不同的 \(7\) 个对子。

现在可怜在 \(4n\) 张牌中先抽取了 \(13\) 张,剩余 \((4n-13)\) 张牌随机抽取,问抽取到的牌集存在一个子牌集是胡的的期望抽取次数。对 \(998244353\) 取模。\(n\le 100\)

做法:

注意到我们关注的只是每一种牌出现了几个。考虑如何判断一个牌集是不是胡的,即我们希望设计一个自动机,其接受每种牌的出现次数,返回这种情况的牌是否是胡的。

假设我们现在处理了 \(1\sim i\) 类型的数字牌,现在我们有几张 \(i+1\) 类型的牌要插进去,那么我们发现其实只有 \((i-1,i)\) 才可以与 \(i+1\) 结合,以产生一个顺子,那么考虑设计一个 \(\mathrm{dp}\),令 \(f(i,j,k,0/1)\) 表示处理了 \(1\sim i\) 类型的数字牌,且这些牌往后扔了 \(j\)\((i-1,i)\)\(k\)\(i\),并且目前是否匹配出对子时能够匹配出的最大面子个数。那么我们只需要判断是否有 \(f(n,j,k,1)\ge 4\) 即可判断出这副牌是否是胡的。注意到由于要匹配完后往后扔,所以 \(0\le j,k\le 2\),否则他们都可以自发形成刻子。

考虑如何转移,假设类型 \(i+1\) 的牌共有 \(x\) 个,那么我们要用这 \(x\) 个牌和之前的 \(j\)\((i-1,i)\) 以及 \(k\)\(i\) 匹配。从这里我们可以看出要有 \(j+k\le x\),因为如果 \(j+k\) 更大那么可以匀一些到前面,这样一定不劣。这样可以组成 \(j\)\((i-1,i,i+1)\) 的顺子,以及 \(k\)\((i,i+1)\),然后还剩下 \((x-j-k)\) 个单 \(i\),这些多出来的单牌既可以自发地形成 \((i+1,i+1,i+1)\) 的刻子,也可以留下来一些给后面继续匹配,因此我们再枚举 \(i+1\) 给了后面 \(p\) 个,那么可以用 \((x-j-k-p)\) 个形成刻子,这可以形成 \(\lfloor\frac{x-j-k-p}{3}\rfloor\) 个刻子。综上,我们在此轮转移中一共获得了 \(j\) 个顺子,\(\lfloor\frac{x-j-k-p}{3}\rfloor\) 个刻子,以及 \(k\)\((i,i+1)\)\(p\)\(i+1\),综上得到转移:

\[f(i+1,k,p,*)\leftarrow f(i,j,k,*)+\left\lfloor\frac{x-j-k-p}{3}\right\rfloor+j \]

再考虑最后一维 \(0/1\) 的转移,我们可以不分配牌来形成对子,此时我们就扔 \(x\) 张牌下去转移,我们也可以手动拿出来 \(2\) 张牌形成对子,这种情况下我们就只能用 \(x-2\) 张,于是分类跑三次转移即可。

而对于情况 \(2\),我们相当于还有一个 \(\mathrm{dp}\),用 \(g(i)\) 表示考虑前 \(i\) 种牌能形成的不同对子的数量,则 \(g(i)=g(i-1)+[cnt_i\ge 2]\),我们判断是否有 \(g(n)\ge 7\) 即可。

于是我们通过两个 \(\mathrm{dp}\) 刻画出了目前选牌的情况。那么考虑用 \(([f(0\sim 2,0\sim 2,0)],[f(0\sim 2,0\sim 2,1)],g(i))\) 这个三元组来表示目前的选牌的状态,用 \(f,g\) 的转移方程,我们可以建立出这个“胡牌自动机”。其意义为:我们在自动机上按 \(i\) 从前往后跑,对于当前跑到的每个节点,其接受类型为 \(i+1\) 的牌的个数 \(x\) 后进行转移,转移到一个新的状态,然后继续往后跑。这个状态数看似很多,是两个 \(3\times 3\) 的矩阵外加一个 \(g\),但是真正跑出来的有用状态其实很少,我们可以做一些优化,将 \(f\) 的最大值限制在 \(4\),将 \(g\) 最大值限制在 \(7\),并将所有表示已经形成胡牌的节点统一缩成一个点,记这个点为 \(0\),经过测定,这样总结点个数是 \(2092\)

由此,我们可以设计出一个在自动机上进行的概率 \(\mathrm{dp}\)\(dp(i,j,u)\) 表示考虑牌类型在 \(1\sim i\) 的牌,这些牌已经额外拿了 \(j\) 张,并且目前拿牌状态在自动机上的对应节点为 \(u\)拿牌方案数(不考虑排列)。转移自然是考虑枚举 \(k\) 表示 \(i\) 这种类型的牌选了 \(k\) 张,这样相当于选择了 \(cnt_{i}+k\)\(i\) 类型的牌,记其在自动机上转移到的节点为 \(\mathrm{trans}(u,cnt_{i}+k)\),则我们得到转移:

\[dp(i,j+k,\mathrm{trans}(u,cnt_{i}+k))\leftarrow \binom{4-cnt_{i}}{k}\times dp(i-1,j,k) \]

其中组合数 \(\binom{4-cnt_{i+1}}{k}\) 是因为要选出 \(k\) 张额外选。

考虑最后怎么统计答案,运用经典转化,我们知道:

\[\begin{aligned} E(出现胡牌的时刻)&=\sum_{i=0}^{+\infty} P(在时刻i还没有出现胡牌) \\ &=1+\sum_{i=1}^{4n-13} P(在时刻i还没有出现胡牌) \end{aligned} \]

\(g_i\) 表示在时刻 \(i\) 还没有出现胡牌的方案数,这个只需要统计 \(dp(n,i,u\ne 0)\) 即可。则我们可以表示出 \(P(在时刻i还没有出现胡牌)=\dfrac{g_i\times i!\times (4n-13-i)!}{(4n-13)!}\),其意义为,前 \(i\) 时刻选择的那些牌可以以任意顺序选,而剩下的 \((4n-13-i)\) 张牌也可以随便选,除以总方案数 \((4n-13)!\) 即可算出概率。于是答案可以表示为:

\[ans=1+\sum_{i=1}^{4n-13}\dfrac{g_i\times i!\times (4n-13-i)!}{(4n-13)!} \]

时间复杂度 \(O(2092\times n^2)\)

posted @ 2026-02-04 15:15  STDJCY  阅读(10)  评论(0)    收藏  举报