[cf1392H]ZS Shuffles Cards

考虑统计每一轮(以抽到小丑为一轮)的贡献,不难发现答案即期望轮数*每轮期望次数

关于期望轮数,当前牌堆里已经在$S$中的卡实际上没有意义,不妨将这一类卡从牌堆中删除

此时,定义$f_{i}$表示$S$中含有$n-i$个元素,之后期望还需要几轮(包括当前这轮)

显然$f_{0}=1$,问题即求$f_{n}$,不难得到转移为$f_{i}=\frac{m}{m+i}(f_{i}+1)+\frac{i}{m+i}f_{i-1}$

将其化简,即有$f_{i}=f_{i-1}+\frac{m}{i}$,因此$f_{n}=\sum_{i=1}^{n}\frac{m}{i}+1$

关于每轮期望次数,定义$g_{i}$表示前$i$次未抽到小丑的概率(也即$P(X\ge i+1)$)

显然$g_{0}=1$,问题即求$\sum_{i=0}^{n}g_{i}$,转移为$g_{i+1}=\frac{n-i}{m+n-i}g_{i}$,即有$g_{i}=\frac{n!(m+n-i)!}{(n-i)!(m+n)!}$

期望次数为$\sum_{i=0}^{n}g_{i}=\frac{n!}{(m+n)!}\sum_{i=0}^{n}m!{n+m-i\choose m}=\frac{{m+n+1\choose n}}{m+n\choose n}=\frac{n}{m+1}+1$

最终,答案即$(\sum_{i=1}^{n}\frac{m}{i}+1)(\frac{n}{m+1}+1)$,时间复杂度为$o(n)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 3000005
 4 #define mod 998244353
 5 int n,m,ans,inv[N];
 6 int main(){
 7     inv[0]=inv[1]=1;
 8     for(int i=2;i<N;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++)ans=(ans+1LL*m*inv[i])%mod;
11     ans=1LL*(ans+1)*(1LL*n*inv[m+1]%mod+1)%mod;
12     printf("%d",ans);
13 }
View Code

 

posted @ 2021-06-11 08:26  PYWBKTDA  阅读(55)  评论(0编辑  收藏  举报