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

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12273291.html