3 条题解
-
3
定义以下事件:
-
事件 为“竞猜者的初始选择为中奖选择”
-
事件 为“竞猜者的初始选择不是中奖选择”
-
事件 为“竞猜者坚持原选择中奖”
-
事件 为“竞猜者改变选择并中奖”
显然事件 和 互为独立事件,且 ,因为 ,则 。进一步地,若竞猜者坚持原选择,显然 ;若竞猜者更改选择,定义:
- 事件 为“除去竞猜者选择的门和主持人打开的门而余下的门后面有小轿车”
则根据条件概率的定义有 ,,根据全概率公式有:
$$\begin{aligned} P(R_2)&=P(C) \\ &=P(A)P(C|A)+P(B)P(C|B) \\ &=\dfrac{1}{3} \times 0 + \dfrac{2}{3} \times 1 \\ &= \dfrac{2}{3} \end{aligned}$$类似的,当 扇门后设有奖品时,事件 发生的概率是 , 事件 发生的概率是 ,则根据条件概率的定义,当事件 发生时,事件 发生的概率就是在剩余的 扇门中存在奖品的概率,而这 扇门中总共存在 件奖品,因此 。同理有 ,根据全概率公式,可以得到问题的解:
$$\begin{aligned} P(R_2)&=P(C) \\ &=P(A)P(C|A)+P(B)P(C|B) \\ &=\dfrac{a}{n} \times \dfrac{a-c-1}{n-b-1} + \dfrac{n-a}{n} \times \dfrac{a-c}{n-b-1} \\ &=\dfrac{n(a-c)-a}{n(n-b-1)} \end{aligned}$$参考代码:
#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; long long MODP(long long a, long long b) { long long c = 1; while (b) { if (b & 1) c = c * a % MOD; a = a * a % MOD; b >>= 1; } return c; } long long INV(long long a) { return MODP(a, MOD - 2); } int main(int argc, char *argv[]) { cin.tie(0), cout.tie(0), ios::sync_with_stdio(false); int cases; long long n, a, b, c; cin >> cases; assert(1 <= cases && cases <= 100); for (int cs = 1; cs <= cases; cs++) { cin >> n >> a >> b >> c; assert(1 <= n && n <= 100000); assert(1 <= a && a <= n - 1); assert(1 <= b && b <= n - 2); assert(0 <= c && c < min(a, b)); long long p = n * (a - c) - a; long long q = n * (n - b - 1); long long g = __gcd(p, q); p /= g, q /= g; cout << (p % MOD) * INV(q % MOD) % MOD << '\n'; } return 0; }
-
-
0
#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; long long MODP(long long a, long long b) { long long c = 1; while (b) { if (b & 1) c = c * a % MOD; a = a * a % MOD; b >>= 1; } return c; } long long INV(long long a) { return MODP(a, MOD - 2); } int main(int argc, char *argv[]) { cin.tie(0), cout.tie(0), ios::sync_with_stdio(false); int cases; long long n, a, b, c; cin >> cases; assert(1 <= cases && cases <= 100); for (int cs = 1; cs <= cases; cs++) { cin >> n >> a >> b >> c; assert(1 <= n && n <= 100000); assert(1 <= a && a <= n - 1); assert(1 <= b && b <= n - 2); assert(0 <= c && c < min(a, b)); long long p = n * (a - c) - a; long long q = n * (n - b - 1); long long g = __gcd(p, q); p /= g, q /= g; cout << (p % MOD) * INV(q % MOD) % MOD << '\n'; } return 0; }
- 1
信息
- ID
- 143
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 85
- 已通过
- 20
- 上传者