题意:
1...
n
1...n
1...n的数的生成概率为
p
i
p_i
pi,执行以下操作:
1.
1.
1.随机生成一个数
x
x
x
2.
2.
2.如果
x
x
x不小于之前生成的所有
x
x
x,进行
1
1
1步骤,否则进入
3
3
3步骤
3.
3.
3.进行分数结算,分数为生成的所有
x
x
x的个数的平方
解法:概率dp
第一阶段:
c
n
t
[
i
]
cnt[i]
cnt[i]表示第一个生成的数字是
i
i
i时还可以生成数字个数的期望,记
j
j
j为下一个生成的数字,则cnt[0]为初始状态
①
i
≤
j
①i \leq j
①i≤j,执行
1
1
1步骤,生成
j
j
j,贡献个数为
c
n
t
[
j
]
+
1
cnt[j]+1
cnt[j]+1,则有
c
n
t
[
i
]
=
∑
j
=
i
n
p
j
∗
(
c
n
t
[
j
]
+
1
)
cnt[i]=\sum_{j=i}^{n}p_j*(cnt[j]+1)
cnt[i]=∑j=inpj∗(cnt[j]+1)
②
i
>
j
②i>j
②i>j,执行
3
3
3步骤,生成
j
j
j后结束,贡献个数为
1
1
1,则有
c
n
t
[
i
]
=
∑
j
=
0
i
−
1
p
j
∗
1
cnt[i]=\sum_{j=0}^{i-1}p_j*1
cnt[i]=∑j=0i−1pj∗1
综上,
c
n
t
[
i
]
=
∑
j
=
0
i
−
1
p
j
+
∑
j
=
i
n
p
j
(
c
n
t
[
j
]
+
1
)
=
∑
j
=
0
i
−
1
p
j
+
∑
j
=
i
+
1
n
p
j
(
c
n
t
[
j
]
+
1
)
+
p
i
∗
(
c
n
t
[
i
]
+
1
)
cnt[i]=\sum_{j=0}^{i-1}p_j+\sum_{j=i}^{n}p_j(cnt[j]+1)=\sum_{j=0}^{i-1}p_j+\sum_{j=i+1}^{n}p_j(cnt[j]+1)+p_i*(cnt[i]+1)
cnt[i]=∑j=0i−1pj+∑j=inpj(cnt[j]+1)=∑j=0i−1pj+∑j=i+1npj(cnt[j]+1)+pi∗(cnt[i]+1),移项化简可得
c
n
t
[
i
]
=
cnt[i]=
cnt[i]=
∑
j
=
0
i
p
j
+
∑
j
=
i
+
1
n
p
j
∗
(
c
n
t
[
j
]
+
1
)
(
1
−
p
i
)
\sum_{j=0}^{i}p_j+\sum_{j=i+1}^{n}p_j*(cnt[j]+1) \over (1-p_i)
(1−pi)∑j=0ipj+∑j=i+1npj∗(cnt[j]+1)
第二阶段:
现在求
E
(
c
n
t
2
)
\mathbb{E(cnt^2)}
E(cnt2),不过
E
(
c
n
t
2
)
!
=
E
2
(
c
n
t
)
\mathbb{E(cnt^2)}!=\mathbb{E^{2}(cnt)}
E(cnt2)!=E2(cnt),也得不到
D
(
c
n
t
)
\mathbb{D(cnt)}
D(cnt),用
d
p
[
i
]
dp[i]
dp[i]表示第一个选的数是
i
i
i时的分数期望,则有
d
p
[
i
]
=
E
(
c
n
t
[
i
]
2
)
dp[i]=\mathbb{E(cnt[i]^2)}
dp[i]=E(cnt[i]2),0为初始状态,答案为
d
p
[
0
]
dp[0]
dp[0]
①
i
>
j
①i>j
①i>j时,贡献个数为1,
1
2
=
1
1^2=1
12=1,所以这部分的分数贡献期望为
∑
j
=
0
i
−
1
p
j
\sum_{j=0}^{i-1}p_j
∑j=0i−1pj
②
i
≤
j
②i \leq j
②i≤j时,贡献个数为
c
n
t
[
j
]
+
1
cnt[j]+1
cnt[j]+1,这部分的分数贡献期望为
p
j
∗
E
(
(
c
n
t
[
j
]
+
1
)
2
)
=
p
j
∗
(
E
(
c
n
t
[
j
]
2
)
+
2
∗
E
(
c
n
t
)
+
1
)
p_j*\mathbb{E((cnt[j]+1)^2)}=p_j*(\mathbb{E(cnt[j]^2)}+2*\mathbb{E(cnt)}+1)
pj∗E((cnt[j]+1)2)=pj∗(E(cnt[j]2)+2∗E(cnt)+1),即有
d
p
[
i
]
=
∑
j
=
i
n
p
j
∗
E
(
c
n
t
[
j
]
+
1
)
2
=
∑
j
=
i
n
p
j
∗
(
E
(
c
n
t
[
j
]
2
)
+
2
∗
E
(
c
n
t
)
+
1
)
=
∑
j
=
i
n
p
j
∗
(
d
p
[
j
]
+
2
∗
c
n
t
[
j
]
+
1
)
dp[i] = \sum_{j=i}^np_j*\mathbb{E(cnt[j]+1)^2}=\sum_{j=i}^{n}p_j*(\mathbb{E(cnt[j]^2)}+2*\mathbb{E(cnt)}+1)=\sum_{j=i}^{n}p_j*(dp[j]+2*cnt[j]+1)
dp[i]=∑j=inpj∗E(cnt[j]+1)2=∑j=inpj∗(E(cnt[j]2)+2∗E(cnt)+1)=∑j=inpj∗(dp[j]+2∗cnt[j]+1)
综上,
d
p
[
i
]
=
∑
j
=
0
i
−
1
p
j
+
∑
j
=
i
n
p
j
∗
(
d
p
[
j
]
+
2
∗
c
n
t
[
j
]
+
1
)
dp[i]=\sum_{j=0}^{i-1}p_j+\sum_{j=i}^{n}p_j*(dp[j]+2*cnt[j]+1)
dp[i]=∑j=0i−1pj+∑j=inpj∗(dp[j]+2∗cnt[j]+1),移项化简得
d
p
[
i
]
=
dp[i]=
dp[i]=
∑
j
=
0
i
p
j
+
∑
j
=
i
+
1
n
p
j
∗
(
d
p
[
j
]
+
2
∗
c
n
t
[
j
]
+
1
)
+
2
∗
c
n
t
[
i
]
(
1
−
p
i
)
\sum_{j=0}^{i}p_j+\sum_{j=i+1}^{n}p_j*(dp[j]+2*cnt[j]+1)+2*cnt[i] \over (1-p_i)
(1−pi)∑j=0ipj+∑j=i+1npj∗(dp[j]+2∗cnt[j]+1)+2∗cnt[i]
AcCode:
#include <iostream>
#include <algorithm>
#define int long long
const int mod = 998244353;
const int N = 110;
int p[N], cnt[N], sum[N], dp[N];
inline int quick_mow(int a, int b) {
int ans = 1;
a %= mod;
while (b) {
if (b & 1) ans = ans * a % mod;
b >>= 1;
a = a * a % mod;
}
return ans;
}
signed main() {
int n, tsum = 0; scanf("%lld", &n);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i]), tsum += p[i];
tsum = quick_mow(tsum, mod - 2);
for (int i = 1; i <= n; i++) p[i] = p[i] * tsum % mod, sum[i] = (sum[i - 1] + p[i]) % mod;
for (int i = n; i>=0; i--) {
int temp = sum[i];
for (int j = i + 1; j <= n; j++) {
temp = (temp + p[j] * (cnt[j] + 1) % mod) % mod;
}
cnt[i] = temp * quick_mow((mod + 1 - p[i]) % mod, mod - 2) % mod;
}
for (int i = n; i >= 0; i--) {
int temp = 2 * p[i] * cnt[i] % mod;
for (int j = i + 1; j <= n; j++) {
int tp = (dp[j] + 2 * cnt[j] + 1) % mod;
temp = (temp + tp * p[j] % mod) % mod;
}
temp = (temp + sum[i]) % mod;
dp[i] = temp * quick_mow((mod + 1 - p[i]) % mod, mod - 2) % mod;
}
printf("%lld\n", dp[0]);
}