zoukankan      html  css  js  c++  java
  • 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)个空位中任选一个插回去。
    答案不变。
    因为修改后的操作相当于修改前的操作的逆,我们把修改前的一个操作序列倒过来就是一个修改后的操作序列,这显然是一一对应的。

  • 相关阅读:
    OpenStack对象存储管理手册(5) OpenStack对象存储系统管理3
    hdu1568Fibonacci
    智能手机中显示信号强度格数
    上篇日本人经营之道 一破坏对手的情绪乱其方寸
    基于Wince的计算器程序
    shell 字符串操作
    轻松记住大端小端的含义
    如何把手机变成你的救生设备
    PM是一个事实
    mysql 5.6 online ddl 测试
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12273291.html
Copyright © 2011-2022 走看看