題意
有一個隨機數生成器,生成數\(x\)的概率為\(p_x\)。現在我們進行如下操作直至結束:
\(1\) 隨機生成一個數\(x\)。
\(2\) 如果已經生成的數中沒有比\(x\)更大的數,則返回操作\(1\),否則,記當前已經生成的數的個數為\(z\),則得到\(z^2\)分,操作結束。
求得分的期望。
\(2\le n\le 100\)
題解
容易發現,如果操作沒有停止,則已經生成的數一定是類似於\(1,1,2,3,4,5,5...\)(按生成順序排列)這樣的非遞減序列。設\(X\)為已經生成的數的個數,則\(X\)是\(\Bbb{N}\)上的離散隨機變量。記\(g_i=P(X>i)\),即長度為\(i\)時還沒有停止的概率。下面考慮如何計算\(P(X>i)\),假設當前長度為\(L\),數\(x\)的出現次數為\(cnt_x\),由於這些數的出現次序是固定的,故有
\[P(X>L)=\sum\prod_{\sum cnt_x=L}p_x^{cnt_x} \]
則\(\{g_i\}\)對應的生成函數為
\[\begin{align} G(x)=\sum_{i=0}^{\infty}g_ix^i=\sum_{i=0}^{\infty}P(X>i)x^i=\prod_{k=1}^{n}\sum_{i=0}^{\infty}p_k^ix^i=\prod_{k=1}^{n}\frac{1}{1-p_kx} \end{align} \]
則得分的期望為
\[\begin{align} E&=\sum_{i=1}^{\infty}P(X=i)i^2\\ &=\sum_{i=1}^{\infty}(P(X\ge i)-P(X\ge i+1))i^2\\ &=\sum_{i=0}^{\infty}(P(X> i)-P(X> i+1))(i+1)^2\\ &=\sum_{i=0}^{\infty}P(X> i)(i+1)^2-\sum_{i=0}^{\infty}P(X> i+1)(i+1)^2\\ &=\sum_{i=0}^{\infty}P(X> i)(i+1)^2-\sum_{i=1}^{\infty}P(X> i)i^2\\ &=\sum_{i=0}^{\infty}P(X> i)(i+1)^2-\sum_{i=0}^{\infty}P(X> i)i^2\\ &=\sum_{i=0}^{\infty}P(X> i)((i+1)^2-i^2)\\ &=\sum_{i=0}^{\infty}P(X> i)(2i+1)\\ &=2G'(1)+G(1).\\ \end{align} \]
由於
\[\frac{G'(x)}{G(x)}=[\ln G(x)]'=[\sum_{k=1}^{n}\ln \frac{1}{1-p_kx}]'=\sum_{k=1}^{n}\frac{p_k}{1-p_kx}, \]
故
\[G'(x)=G(x)\sum_{k=1}^{n}\frac{p_k}{1-p_kx}. \]
#include <bits/stdc++.h>
using namespace std;
using ll=long long ;
const ll M=998244353;
ll ans=1,a[102];
int n;
ll pm(ll x,ll b){x%=M;ll res=1;while(b){if(b&1)res=res*x%M;x=x*x%M;b>>=1;}return res;}
void f1(){
cin>>n;
ll na=0,ans=1,res=0;
for(int i=1;i<=n;i++){
cin>>a[i];na+=a[i];na%=M;
}
ll inv=pm(na,M-2);
for(int i=1;i<=n;i++){
a[i]=a[i]*inv%M;
ll tmp=pm(1+M-a[i],M-2);
res+=tmp*a[i]%M;
res%=M;
ans=ans*tmp%M;
}
res=(res*2%M+1)%M;
ans=ans*res%M;
cout<<ans;
}
int main(){
f1();
return 0;
}