Problem. B

题意简述:

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

数据范围:

\(n\le5*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\)个集合)。
而这样的一组划分也一定会对应恰好一组合法的抽牌序列。即每次找到最大的数所在的集合,这个集合就是当前最小的未出现的数的位置集合。
因此合法的抽牌序列的个数是\(\sum\limits_{i=0}^n\left\{m\atop i\right\}\)

Extend

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

posted @ 2020-02-07 15:45  Shiina_Mashiro  阅读(175)  评论(0编辑  收藏  举报