题目链接
题意
n 个物品,每个时刻都恰好出现一个物品,有 pi 的概率出现 i。
记物品 i 第一次出现时间为 ti,求 t 的平均数 t 与方差 σ2 的期望。
思路
对于平均数,显然 E(t)=n1∑i=1npi1。
根据方差公式 σ2=n1∑i=1nti2−t2,得:
E(σ2)=n2n−1i=1∑nE(ti2)−n22i=1∑nj=i+1∑nE(titj)
转换成求 E(ti2) 和 E(titj)。
E(t2)=i=0∑+∞(1−p)i⋅p⋅(i+1)2=i=0∑+∞(1−p)i⋅p⋅i2+i=0∑+∞(1−p)i⋅p⋅(2i+1)=(1−p)i=1∑+∞(1−p)i−1⋅p⋅i2+pi=0∑+∞(1−p)i⋅(2i+1)=(1−p)E(t2)+pi=0∑+∞(1−p)i⋅(2i+1)=i=0∑+∞(1−p)i⋅(2i+1)=p1+2i=0∑+∞(1−p)ii
记 s=∑i=0+∞(1−p)ii,则 s−(1−p)s=∑i=1+∞(1−p)i=p1−1,所以 s=pp1−1=p21−p1。
代回原式:E(t2)=p21−p。
对于 E(titj),考虑 2E(titj)=E2(ti)+E2(tj)−E((ti−tj)2),转为求 E((ti−tj)2)。
这是求 i,j 中出现一个后另一个期望再过多久出现。显然 i 比 j 先出现的概率为 pi+pjpj,由此可得:
E((ti−tj)2)=pi+pjpiE(ti2)+pi+pjpjE(tj2)=pi+pjpiE(ti2)+pjE(tj2)
实现
暴力枚举 i,j 求 E(titj) 的时间复杂度是 O(n2logn),统一预处理逆元后是 O(n2) 的。
然而 Early 并没有预处理逆元。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<cstdio> #include<cctype> #include<numeric> using namespace std; const int N=5000,mod=998244353; int n,p[N+1]; int Et[N+1],Et2[N+1]; int Eave,Evar; int pow(int x,int t) { int r=1; while(t) { if(t&1) { r=1ll*r*x%mod; } t>>=1,x=1ll*x*x%mod; } return r; } inline int inv(int x) { return pow(x,mod-2); } int main() { freopen("card.in","r",stdin); freopen("card.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&p[i]); } for(int i=1,id=inv(accumulate(p+1,p+n+1,0ll)%mod);i<=n;++i) { p[i]=1ll*p[i]*id%mod; } for(int i=1;i<=n;++i) { Et[i]=inv(p[i]); Et2[i]=1ll*(2-p[i])*inv(1ll*p[i]*p[i]%mod)%mod; } Eave=accumulate(Et+1,Et+n+1,0ll)%mod*inv(n)%mod; int coef1=0,coef2=0; for(int i=1;i<=n;++i) { coef1=(coef1+Et2[i])%mod; } coef1=1ll*coef1*(n-1)%mod*inv(n*n)%mod; for(int i=1;i<n;++i) { for(int j=i+1;j<=n;++j) { coef2=(coef2+(1ll*p[i]*Et2[i]+1ll*p[j]*Et2[j])%mod*inv(p[i]+p[j]))%mod; } } coef2=1ll*coef2*inv(n*n)%mod; Evar=(coef1-coef2)%mod; printf("%d\n%d\n",(Eave+mod)%mod,(Evar+mod)%mod); return 0; }
|