cunzai_zsy0531

关注我

CF1392H ZS Shuffles Cards 题解

首先,抽到一次鬼牌视作一次迭代,那么每次迭代的期望长度是一样的,即

\[\begin{aligned} E(x)&=1\times\frac{m}{n+m}+2\times\frac{n}{n+m}\times\frac{m}{n+m-1}+\ldots+(n+1)\times(\prod_{j=0}^{n-1} \frac{n-j}{n+m-j})\times\frac{m}{n+m-n}\\ &=\sum_{i=1}^{n+1}\frac{im}{n+m-i+1}\prod_{j=0}^{i-2}\frac{n-j}{n+m-j} \end{aligned} \]

后面那个式子可以预处理,加上求逆元总复杂度是 \(O(n\log p)\)

然后现在考虑设 \(f_i\) 表示还有 \(i\) 个数不在集合里,期望进行的迭代次数。这个可以递推计算,即

\[f_i=\frac{m}{m+k}(f_i+1)+\frac{k}{m+k}f_{i-1} \]

化简得

\[f_i=f_{i-1}+\frac{m}{k}\]

边界是 \(f_0=1\),可以求得 \(f_n=1+m\sum_{i=1}^{n}\frac{1}{i}\),可以直接 \(O(n)\) 求出。

最后的答案期望可以直接相乘,就做完了。

点击查看代码
const int N=2e6+13;
int n,m,a[N],inv[N];
int main(){
//file();
	read(n),read(m);
	a[1]=1;
	for(int i=2;i<=n+1;++i) a[i]=(ll)a[i-1]*(n-i+2)%mod*qpow(n+m-i+2,mod-2)%mod;
	int E=0;
	for(int i=1;i<=n+1;++i) E+=(ll)a[i]*i%mod*m%mod*qpow(n+m-i+1,mod-2)%mod,E%=mod;
	Math::Oninv(inv,n);
	int S=0;
	for(int i=1;i<=n;++i) S=(S+inv[i])%mod;S=((ll)S*m%mod+1)%mod;
	println((ll)S*E%mod);
	return 0;
}
posted @ 2022-05-28 15:17  cunzai_zsy0531  阅读(10)  评论(0编辑  收藏  举报