zoukankan      html  css  js  c++  java
  • 「题解」ARC 061 F 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}inom{n+t-1}{n-1}3^{m+k-t}sum_{i=t-k}^{m}inom{t}{i} ]

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

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

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

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

    Code

  • 相关阅读:
    云计算管理平台之OpenStack启动虚拟机实例
    云计算管理平台之OpenStack网络服务neutron
    云计算管理平台之OpenStack计算服务nova
    云计算管理平台之OpenStack镜像服务glance
    云计算管理平台之OpenStack认证服务Keystone
    云计算管理平台之OpenStack简介及基础环境搭建
    jumpserver部署使用
    分布式消息系统之Kafka集群部署
    写好C#代码的技巧
    .NET应用程序7种最常见的性能问题及其解决方案
  • 原文地址:https://www.cnblogs.com/do-while-true/p/15321779.html
Copyright © 2011-2022 走看看