考虑统计每一轮(以抽到小丑为一轮)的贡献,不难发现答案即期望轮数*每轮期望次数
关于期望轮数,当前牌堆里已经在$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 }