do_while_true

一言(ヒトコト)

「题解」ARC061F Card Game for Three

orz qyc

小 A,小 B,小 C 在玩游戏。他们每个人分别有 \(n,m,k\) 张牌,每张牌上面写着 \(a,b,c\) 三个字母中的其中一个,每个回合有一个人出牌,如果出牌为 \(a\) 则小 A 下一个回合出牌,如果出牌为 \(b\) 则小 B 下一个回合出牌,小 C 同理。若轮到某位玩家出牌时,其手中无牌,则该位玩家获胜。

现在小 A 第一个出牌,对所有 \(3^{n+m+k}\) 种手牌拥有的可能性计算小 A 获胜的方案数,对 \(10^9+7\) 取模。

如果按照打出的顺序排成一个长度为 \(l\) 的序列,小 A 获胜当且仅当:\(a\) 恰好出现了 \(n\) 次且在最后一次出现,\(b\) 出现了不多于 \(m\) 次,\(c\) 出现了不多于 \(k\) 次。

而这个长度为 \(l\) 的序列对应了 \(3^{n+m+k-l}\) 种手牌拥有的情况。

\(n\) 次是一定打的,枚举 \(b,c\) 出现的次数 \(t\),然后枚举 \(b\) 出现的次数 \(i\)

\[\sum_{t=0}^{m+k}\binom{n+t-1}{n-1}3^{m+k-t}\sum_{i=t-k}^{m}\binom{t}{i} \]

第一个组合数是除了最后一个是 \(a\),确定 \((n-1)\)\(a\) 的位置,\(3^{m+k-t}\) 是计算的对应了多少种手牌拥有情况,最后一个组合数为在 \(t\)\(b,c\) 都可以填的空位挑出 \(i\) 个填 \(b\),注意这个组合数可能会出现 \(i<0\)\(i>t\) 的情况,由于是考虑其实际的组合意义,所以当出现这样的情况时视为 \(0\)

最后一个实际上是组合数一行的区间和,众所周知这个的计算是困难的,由于这个区间和的形式比较特殊,考虑递推出这个东西:

\[\begin{aligned} S(t)=&\sum_{i=t-k}^{m}\binom{t}{i} \\ =&\sum_{i=t-k}^{m}\binom{t-1}{i-1}+\sum_{i=t-k}^{m}\binom{t-1}{i} \\ =&\sum_{i=t-k-1}^{m-1}\binom{t-1}{i}+\sum_{i=t-k}^{m}\binom{t-1}{i} \\ =&\ 2\cdot\sum_{i=t-k-1}^{m}\binom{t-1}{i}-\binom{t-1}{m}-\binom{t-1}{t-k-1} \\ =&\ 2\cdot S(t-1)-\binom{t-1}{m}-\binom{t-1}{t-k-1} \end{aligned} \]

至此,可以在 \(\mathcal{O}(n+\log \bmod)\) 的时间复杂度内解决问题。

Code

posted @ 2021-09-22 21:22  do_while_true  阅读(38)  评论(0编辑  收藏  举报