码迷,mamicode.com
首页 > 其他好文 > 详细

Card Shuffling Problem

时间:2020-02-07 17:06:20      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:就会   不同   答案   car   最大   class   ext   之间   序列   

题意简述:

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

数据范围:

\(n\le5*10^6\)

解法:

首先总方案数数是\(n^m\)
我们考虑一下合法抽牌序列(序列中的元素为牌的标号)应该满足什么条件。
显然对于相同标号的牌,只有最后一次在序列中的出现才会对它的位置有影响。
序列的最后一位必须是\(1\),然后我们把序列中的所有的\(1\)删掉。
然后序列中的最后一位就必须是\(2\),然后我们把序列中的所有的\(2\)删掉。
。。。
直到删掉了序列中的所有元素位置。
到此我们可以总结出合法抽牌序列的充要条件:
\(1.\)若序列中出现了\(k\)个不同的数,那么这\(k\)个不同的数一定是\(1,\cdots,k\)
\(2.\)序列中\(i\)的最后一次出现位置之后的数必须\(<i\)
满足这两个限制的抽牌序列一定是合法的,有任何一个条件不满足的抽牌序列一定不合法。
然后我们考虑把相同的数的出现位置并成一个集合,不同的数的出现位置集合之间是无序的,这样一个合法的抽牌序列就会对应\(\{1,\cdots,m\}\)的一组划分。
\(\{1,\cdots,m\}\)的一组划分也一定会对应恰好一组合法的抽牌序列。
即每次找到最大的数所在的集合,这个集合就是当前最小的未出现的数的位置集合。
因此合法的抽牌序列的个数是\(B_m\)
然后我们考虑如何求\(B_m\)
一个结论是\(B_n\)的EFG是\(\exp(\exp(x)-1)\),但是MTT+exp常数太大了。
我们考虑推式子:
\(B_n=\sum\limits_{k=0}^n\left\{n\atop k\right\}=\sum\limits_{k=0}^n\frac1{k!}\sum\limits_{i=0}^k(-1)^i{k\choose i}(k-i)^n=\sum\limits_{k=0}^n\sum\limits_{i+j=k}\frac{(-1)^i}{i!}\frac{j^n}{j!}\)
然后就可以MTT了,但是MTT常数太大了。
继续化简一下:
\(B_n=\sum\limits_{k=0}^n\sum\limits_{i+j=k}\frac{(-1)^i}{i!}\frac{j^n}{j!}=\sum\limits_{i=0}^n\frac{(-1)^i}{i!}\sum\limits_{j=0}^{n-i}\frac{j^n}{j!}\)
后缀和一下就行了,快速幂常数太小了。

Extend

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

Card Shuffling Problem

标签:就会   不同   答案   car   最大   class   ext   之间   序列   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!