目录
- 阻拦投篮
- 题目描述
- 背景
- 输入
- 输出
- 数据范围
- 题解
- 解法
- 打赏
阻拦投篮
题目描述
背景
现在你得到了一个可以阻拦投篮的宝物,它会在投球后把篮球传送回运动员手上,但是宝物的成功率和篮球在空中运动的时间有关,并且在特定的时间点成功的几率是固定的,例如在第
3
3
3秒成功率是
1
4
1 \over 4
41,那么不论是第几次投球,在篮球投出后的第
3
3
3秒,宝物成功的几率都是
1
4
1 \over 4
41
宝物每秒初可以使用一次,例如在投球后的第
1
1
1秒时使用失败,可以在第
2
2
2秒接着使用,直到阻拦成功或投篮成功,且投球瞬间可以阻拦,但是球击中篮筐的瞬间不可阻拦。并且一旦篮球回到运动员手上,他会立马再次投球。现在你想知道使用宝物的情况下,运动员从第一次投球到投篮成功的期望时间间隔
输入
- 第一行一个整数 n n n,表示篮球到篮筐的时间;
- 接下来 n n n行每行包含两个整数 x i , y i x_i , y_i xi,yi,二者之商 x i y i x_i \over y_i yixi表示第 i i i秒初宝物成功的概率
输出
输出一个整数表示答案(答案是一个有理数,请输出答案对质数 998244353 998244353 998244353取模的结果)
数据范围
1 ≤ n ≤ 1 e 5 , 1 ≤ x i < y i ≤ 1 e 9 1 \le n \le 1e5 , 1 \le x_i < y_i \le 1e9 1≤n≤1e5,1≤xi<yi≤1e9
题解
解法
每次投球之后击中篮筐且不被阻拦的概率是一样的,而求期望需要算出第一次投球后经过各种情况最终投中的概率再分别乘上各自的用时,因而这些情况中最后一次投球都击中了篮筐,所以对于这些情况,它们最后一次投球后的概率计算都是一样的
所以可以按照次数对这些不同的情况进行分类,分别算出期望时间再相加
- 若第一次投球击中,则概率为 ∏ i = 1 n ( 1 − x i y i ) \prod_{i = 1}^n (1 - {x_i \over y_i}) ∏i=1n(1−yixi),将其记作 m m m,那么第一次击中这类情况对最终期望的贡献为 m ∗ n m * n m∗n
- 若第二次投球击中,则需在一次击中的基础上向前增加一次未击中的投球,而这次未击中的投球有很多种情况,它们的概率之和为
1
−
m
1 - m
1−m,所以二次击中的概率为
(
1
−
m
)
m
(1 - m)m
(1−m)m。由于那次未击中的投球存在某些情况耗费时间,所以二次击中这类情况的贡献不能简单视为
(
1
−
m
)
m
∗
n
(1 - m)m* n
(1−m)m∗n。易知那次未击中的投球共有
n
n
n种情况,由第
i
i
i种情况推得的二次击中的贡献为
[
∏
j
=
1
i
−
1
(
1
−
x
j
y
j
)
]
∗
x
i
y
i
∗
m
∗
(
n
+
i
−
1
)
[\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} * m * (n + i - 1)
[∏j=1i−1(1−yjxj)]∗yixi∗m∗(n+i−1),所以贡献之和为:
∑ i = 1 n { [ ∏ j = 1 i − 1 ( 1 − x j y j ) ] ∗ x i y i ∗ m ∗ ( n + i − 1 ) } = m ∗ n ∗ ∑ i = 1 n { [ ∏ j = 1 i − 1 ( 1 − x j y j ) ] ∗ x i y i } + m ∗ ∑ i = 1 n { [ ∏ j = 1 i − 1 ( 1 − x j y j ) ] ∗ x i y i ∗ ( i − 1 ) } = m ∗ n ∗ ( 1 − m ) + m ∗ ∑ i = 1 n { [ ∏ j = 1 i − 1 ( 1 − x j y j ) ] ∗ x i y i ∗ ( i − 1 ) } \begin{aligned} \sum_{i = 1}^n \{ [\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} * m * (n + i - 1) \} & = m * n * \sum_{i = 1}^n \{ [\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} \} + m * \sum_{i = 1}^n \{ [\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} * (i - 1) \}\\ & = m * n * (1 - m) + m * \sum_{i = 1}^n \{ [\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} * (i - 1) \} \end{aligned} i=1∑n{[j=1∏i−1(1−yjxj)]∗yixi∗m∗(n+i−1)}=m∗n∗i=1∑n{[j=1∏i−1(1−yjxj)]∗yixi}+m∗i=1∑n{[j=1∏i−1(1−yjxj)]∗yixi∗(i−1)}=m∗n∗(1−m)+m∗i=1∑n{[j=1∏i−1(1−yjxj)]∗yixi∗(i−1)}
依此类推,设
k
=
∑
i
=
1
n
{
[
∏
j
=
1
i
−
1
(
1
−
x
j
y
j
)
]
∗
x
i
y
i
∗
(
i
−
1
)
}
k = \sum_{i = 1}^n \{ [\prod_{j = 1}^{i - 1} (1 - {x_j \over y_j})] * {x_i \over y_i} * (i - 1) \}
k=∑i=1n{[∏j=1i−1(1−yjxj)]∗yixi∗(i−1)},因为
1
−
m
,
k
1 - m , k
1−m,k都是常数,所以第
i
(
i
>
1
)
i(i > 1)
i(i>1)次投球击中的概率和贡献可以由第
i
−
1
i - 1
i−1次投球击中的概率和贡献线性表示,设第
i
i
i次投球击中的概率和贡献分别为
p
i
,
a
i
p_i , a_i
pi,ai,即
[
p
i
a
i
]
=
[
1
−
m
0
k
1
−
m
]
[
p
i
−
1
a
i
−
1
]
(
i
>
1
)
\begin{bmatrix} p_i \\ a_i \end{bmatrix} = \begin{bmatrix} 1 - m & 0 \\ k & 1 - m \end{bmatrix} \begin{bmatrix} p_{i - 1} \\ a_{i - 1} \end{bmatrix}(i > 1)
[piai]=[1−mk01−m][pi−1ai−1](i>1)
又
[
1
−
m
0
k
1
−
m
]
i
=
[
(
1
−
m
)
i
0
i
(
1
−
m
)
i
−
1
k
(
1
−
m
)
i
]
\begin{bmatrix} 1 - m & 0 \\ k & 1 - m \end{bmatrix}^i = \begin{bmatrix} (1 - m)^i & 0 \\ i(1 - m)^{i - 1}k & (1 - m)^i \end{bmatrix}
[1−mk01−m]i=[(1−m)ii(1−m)i−1k0(1−m)i],因此:
[
p
i
a
i
]
=
[
1
−
m
0
k
1
−
m
]
i
−
1
[
p
1
a
1
]
=
[
(
1
−
m
)
i
−
1
0
(
i
−
1
)
(
1
−
m
)
i
−
2
k
(
1
−
m
)
i
−
1
]
[
m
m
n
]
=
[
m
(
1
−
m
)
i
−
1
m
(
1
−
m
)
i
−
2
[
k
(
i
−
1
)
+
n
(
1
−
m
)
]
]
\begin{aligned} \begin{bmatrix} p_i \\ a_i \end{bmatrix} & = \begin{bmatrix} 1 - m & 0 \\ k & 1 - m \end{bmatrix}^{i - 1} \begin{bmatrix} p_1 \\ a_1 \end{bmatrix} \\ & = \begin{bmatrix} (1 - m)^{i - 1} & 0 \\ (i - 1)(1 - m)^{i - 2}k & (1 - m)^{i - 1} \end{bmatrix} \begin{bmatrix} m \\ mn \end{bmatrix} \\ & = \begin{bmatrix} m (1 - m)^{i - 1} \\ m(1 - m)^{i - 2}[k(i - 1) + n(1 - m)] \end{bmatrix} \end{aligned}
[piai]=[1−mk01−m]i−1[p1a1]=[(1−m)i−1(i−1)(1−m)i−2k0(1−m)i−1][mmn]=[m(1−m)i−1m(1−m)i−2[k(i−1)+n(1−m)]]
所以最终的期望为:
∑
i
=
1
∞
m
(
1
−
m
)
i
−
2
[
k
(
i
−
1
)
+
n
(
1
−
m
)
]
=
m
n
∑
i
=
1
∞
(
1
−
m
)
i
−
1
+
m
k
∑
i
=
0
∞
(
i
+
1
)
(
1
−
m
)
i
=
m
n
1
−
(
1
−
m
)
∞
1
−
(
1
−
m
)
+
m
k
∑
i
=
0
∞
(
−
1
)
i
(
i
+
1
)
!
i
!
(
m
−
1
)
i
=
m
n
m
+
m
k
∗
1
m
2
=
n
+
k
m
\begin{aligned} \sum_{i = 1}^\infty m(1 - m)^{i - 2}[k(i - 1) + n(1 - m)] & = mn \sum_{i = 1}^\infty (1 - m)^{i - 1} + mk \sum_{i = 0}^\infty (i + 1)(1 - m)^i \\ & = mn {1 - (1 - m)^\infty \over 1 - (1 - m)} + mk \sum_{i = 0}^\infty {(-1)^i (i + 1)! \over i!} (m - 1)^i \\ & = {mn \over m} + mk * {1 \over m^2}\\ & = n + {k \over m} \end{aligned}
i=1∑∞m(1−m)i−2[k(i−1)+n(1−m)]=mni=1∑∞(1−m)i−1+mki=0∑∞(i+1)(1−m)i=mn1−(1−m)1−(1−m)∞+mki=0∑∞i!(−1)i(i+1)!(m−1)i=mmn+mk∗m21=n+mk
由于
k
,
m
k , m
k,m均为分数,所以各需要两个变量来储存,分别表示分子和分母,答案要求的是有理数对
998244353
998244353
998244353取模的结果,所以需要使用乘法逆元
代码如下:
#include<cstdio>
#define il inline
#define ll long long
const int mod = 998244353;
il int read() {
int x = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x;
}
il int qpow(int x, int y) {
int ret = 1;
for(int i = x; y; i = (ll)i * i % mod, y >>= 1)
if(y % 2) ret = (ll)ret * i % mod;
return ret;
}
int n, ma = 1, mb = 1, ka, kb = 1; //分别表示m的分子、分母,k的分子、分母
int main() {
n = read();
for(int i = 1; i <= n; ++i) {
int a = read() % mod, b = read() % mod;
ka = ((ll)ka * mb % mod * b % mod + (ll)kb * ma % mod * a % mod * (i - 1) % mod) % mod;
kb = (ll)kb * mb % mod * b % mod;
ma = (ll)ma * ((b - a + mod) % mod) % mod;
mb = (ll)mb * b % mod;
}
int ansb = (ll)ma * kb % mod, ansa = ((ll)n * ansb % mod + (ll)mb * ka % mod) % mod;
printf("%d", (ll)ansa * qpow(ansb, mod - 2) % mod); //用欧拉定理求乘法逆元
return 0;
}
打赏
制作不易,若有帮助,欢迎打赏!