Link
记\(SA=\sum\limits_{i=1}^nA_a,SB=\sum\limits_{i=1}^n(B_i-1)\)。
设\(S=\{t_1,\cdots,t_n\}\),其中\(t_i\)表示\(i\)的个数达到\(B_i\)的时间,那么我们要求的就是\(\operatorname E(\max(S))\)。
考虑Min-Max容斥,\(\operatorname E(\max(S))=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\operatorname E(\min(T))\),\(\min(T)\)就是\(T\)集合中第一次元素\(i\)的个数达到\(B_i\)的时间。
根据期望的线性性,\(\operatorname E(\min(T))\)等于所有没有元素\(i\)的个数达到\(B_i\)的期望停留时间的和。
设\(T\)中的元素为\(a_1,\cdots,a_m\),\(a_i\)出现过\(x_i\)次,记\(S_T=\sum\limits_{i=1}^mA_{a_i}\)。
我们知道到达该状态后期望留在该状态的时间是\(\sum\limits_{i=0}^{+\infty}(\frac{S_T}{SA})^i=\frac{SA}{S_T}\),因此我们只需要求出到达该状态的概率。
根据可重组合的概率公式得到概率为\((\sum\limits_{i=1}^mx_i)!\prod\limits_{i=1}^m\frac{(\frac{A_{a_i}}{S_T})^{x_i}}{x_i!}=(\sum\limits_{i=1}^mx_i)!S_T^{\sum\limits_{i=1}^n x_i}\prod\limits_{i=1}^m\frac{A_{a_i}^{x_i}}{x_i!}\)。
那么我们要求的的是所有下标集合\(T\)的所有\(x_i\)序列的期望停留时间的贡献之和,考虑dp。
一个集合的贡献是\((-1)^{m-1}(\frac{SA}{S_T})(\sum\limits_{i=1}^mx_i)!S_T^{\sum\limits_{i=1}^n x_i}\prod\limits_{i=1}^m\frac{A_{a_i}^{x_i}}{x_i!}\),我们考虑把难以转移的\(S_T\)和\(\sum\limits_{i=1}x_i\)拿出来放进dp状态。
设\(S_T=j\),\(\sum\limits_{i=1}^mx_i=k\),那么一个集合的贡献是\((-1)^{m-1}(\frac{SA}j)k!j^k\prod\limits_{i=1}^m\frac{A_{a_i}^{x_i}}{x_i!}\)。
那么设\(f_{i,j,k}\)只考虑前\(i\)个元素,所有\(S_T=j\),\(\sum\limits_{i=1}^mx_i=k\)的集合的\((-1)^{m-1}\prod\limits_{i=1}^m\frac{A_{a_i}^{x_i}}{x_i!}\)之和。
转移的话考虑多出来一个\(i\)元素会造成什么影响,显然我们只需要考虑包含\(i\)这个下标的集合,然后再枚举\(i\)的出现次数\(l\in[0,B_i)\),就有\(-1\frac{A_i^l}{l!}f_{i-1,j,k}\rightarrow f_{i,j+A_i,k+l}\)。
答案就是\(\sum\limits_{j=1}^s\sum\limits_{k=0}^{SB}(\frac{SA}{j})k!j^kf_{j,k}\)。
#include<cstdio>
const int N=404,P=998244353;
int f[N][N],A[N],B[N],fac[N],ifac[N];
int read(){int x;scanf("%d",&x);return x;}
int inc(int a,int b){return a+=b-P,a+(a>>31&P);}
int dec(int a,int b){return a-=b,a+(a>>31&P);}
int mul(int a,int b){return 1ll*a*b%P;}
int pow(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int main()
{
int n=read(),ans=0,s=0;
f[0][0]=P-1,fac[0]=1;
for(int i=1;i<=n;++i) s+=A[i]=read(),B[i]=read();
for(int i=1;i<=400;++i) fac[i]=mul(fac[i-1],i);
ifac[400]=pow(fac[400],P-2);
for(int i=400;i;--i) ifac[i-1]=mul(ifac[i],i);
for(int i=1;i<=n;++i)
for(int j=s;~j;--j)
for(int k=400;~k;--k)
if(f[j][k])
for(int l=0,r=1;l<B[i];++l,r=mul(r,A[i]))
f[j+A[i]][k+l]=dec(f[j+A[i]][k+l],mul(mul(r,ifac[l]),f[j][k]));
for(int i=1;i<=s;++i)
for(int r=pow(i,P-2),t=i==s? 1:mul(s,pow(i,P-2)),j=0,k=1;j<=400;++j,k=mul(k,r))
ans=inc(ans,mul(mul(mul(f[i][j],fac[j]),k),t));
printf("%d",ans);
}