0%

「2021-10-06 联考」抽卡

题目链接

题意

nn 个物品,每个时刻都恰好出现一个物品,有 pip_i 的概率出现 ii

记物品 ii 第一次出现时间为 tit_i,求 tt 的平均数 t\overline t 与方差 σ2\sigma^2 的期望。

思路

对于平均数,显然 E(t)=1ni=1n1piE(\overline t)=\frac1n\sum_{i=1}^n\frac1{p_i}

根据方差公式 σ2=1ni=1nti2t2\sigma^2=\frac1n\sum_{i=1}^nt_i^2-\overline t^2,得:

E(σ2)=n1n2i=1nE(ti2)2n2i=1nj=i+1nE(titj)E(\sigma^2)=\frac{n-1}{n^2}\sum_{i=1}^nE(t_i^2)-\frac2{n^2}\sum_{i=1}^n\sum_{j=i+1}^nE(t_it_j)

转换成求 E(ti2)E(t_i^2)E(titj)E(t_it_j)

E(t2)=i=0+(1p)ip(i+1)2=i=0+(1p)ipi2+i=0+(1p)ip(2i+1)=(1p)i=1+(1p)i1pi2+pi=0+(1p)i(2i+1)=(1p)E(t2)+pi=0+(1p)i(2i+1)=i=0+(1p)i(2i+1)=1p+2i=0+(1p)ii\begin{aligned} E(t^2)&=\sum_{i=0}^{+\infty}(1-p)^i\cdot p\cdot(i+1)^2\\ &=\sum_{i=0}^{+\infty}(1-p)^i\cdot p\cdot i^2+\sum_{i=0}^{+\infty}(1-p)^i\cdot p\cdot(2i+1)\\ &=(1-p)\sum_{i=1}^{+\infty}(1-p)^{i-1}\cdot p\cdot i^2+p\sum_{i=0}^{+\infty}(1-p)^i\cdot(2i+1)\\ &=(1-p)E(t^2)+p\sum_{i=0}^{+\infty}(1-p)^i\cdot(2i+1)\\ &=\sum_{i=0}^{+\infty}(1-p)^i\cdot(2i+1)\\ &=\frac1p+2\sum_{i=0}^{+\infty}(1-p)^ii \end{aligned}

s=i=0+(1p)iis=\sum_{i=0}^{+\infty}(1-p)^ii,则 s(1p)s=i=1+(1p)i=1p1s-(1-p)s=\sum_{i=1}^{+\infty}(1-p)^i=\frac1p-1,所以 s=1p1p=1p21ps=\frac{\frac1p-1}p=\frac1{p^2}-\frac1p

代回原式:E(t2)=1pp2E(t^2)=\frac{1-p}{p^2}

对于 E(titj)E(t_it_j),考虑 2E(titj)=E2(ti)+E2(tj)E((titj)2)2E(t_it_j)=E^2(t_i)+E^2(t_j)-E\left((t_i-t_j)^2\right),转为求 E((titj)2)E\left((t_i-t_j)^2\right)

这是求 i,ji,j 中出现一个后另一个期望再过多久出现。显然 iijj 先出现的概率为 pjpi+pj\frac{p_j}{p_i+p_j},由此可得:

E((titj)2)=pipi+pjE(ti2)+pjpi+pjE(tj2)=piE(ti2)+pjE(tj2)pi+pj\begin{aligned} E\left((t_i-t_j)^2\right)&=\frac{p_i}{p_i+p_j}E(t_i^2)+\frac{p_j}{p_i+p_j}E(t_j^2)\\ &=\frac{p_iE(t_i^2)+p_jE(t_j^2)}{p_i+p_j} \end{aligned}

实现

暴力枚举 i,ji,jE(titj)E(t_it_j) 的时间复杂度是 O(n2logn)\mathcal O(n^2\log n),统一预处理逆元后是 O(n2)\mathcal O(n^2) 的。

然而 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;
}