• Problem. B


    题意简述:

    有一堆标号为(1,cdots,n)的牌,初始有序。
    现在我们进行(m)次如下的操作:在(n)张牌中任选一张抽出然后放回堆顶。
    求最后牌堆依旧有序的概率,答案对(1000000007)取模。

    数据范围:

    (nle5*10^6)

    解法:

    首先总方案数数是(n^m)
    先将牌标号为(1,cdots,n),考虑合法抽牌序列(第(i)个元素为第(i)次抽出的牌的标号)应该满足什么条件。
    显然对于相同标号的牌,只有最后一次在序列中的出现才会对它的位置有影响。
    序列的最后一位必须是(1),然后我们把序列中的所有的(1)删掉。
    然后序列中的最后一位就必须是(2),然后我们把序列中的所有的(2)删掉。
    ......
    到此我们可以总结出合法抽牌序列的充要条件:
    (1.)若序列中出现了(k)个不同的数,那么这(k)个不同的数一定是(1,cdots,k)
    (2.)序列中(i)的最后一次出现位置之后的数必须(<i)
    (3.)序列中最多出现(n)个不同的数。
    满足这两个限制的抽牌序列一定是合法的,有任何一个条件不满足的抽牌序列一定不合法。
    然后把相同的数的出现位置合并成一个集合,不同的数的出现位置集合之间是无序的,这样一个合法的抽牌序列就会对应({1,cdots,m})的一组划分(划分后不能超过(n)个集合)。
    而这样的一组划分也一定会对应恰好一组合法的抽牌序列。即每次找到最大的数所在的集合,这个集合就是当前最小的未出现的数的位置集合。
    因此合法的抽牌序列的个数是(sumlimits_{i=0}^nleft{matop i ight})

    Extend

    把操作改为:把堆顶的牌抽出,在剩下的(n)个空位中任选一个插回去。
    答案不变。
    因为修改后的操作相当于修改前的操作的逆,我们把修改前的一个操作序列倒过来就是一个修改后的操作序列,这显然是一一对应的。

  • 相关阅读:
    inputstream和outputstream读写数据模板代码
    如何显示包的上一层包
    我的cnblogs设置代码
    myeclipse ctrl+shift+F失效
    数据包加密解密
    用VisualSVN Server创建版本库,以及TortoiseSVN的使用
    权限验证MVC
    Asp.net MVC23 使用Areas功能的常见错误
    MVC基础知识
    最全的Resharper快捷键汇总
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12273291.html
Copyright © 2020-2023  润新知