2 条题解

  • 3
    @ 2021-6-13 19:39:21

    定义以下事件:

    • 事件 AA 为“竞猜者的初始选择为中奖选择”

    • 事件 BB 为“竞猜者的初始选择不是中奖选择”

    • 事件 R1R_1 为“竞猜者坚持原选择中奖”

    • 事件 R2R_2 为“竞猜者改变选择并中奖”

    显然事件 AABB 互为独立事件,且 AB=SA \cup B=S,因为 P(A)=1/3P(A)=1/3,则 P(B)=1P(A)=23P(B)=1-P(A)=\dfrac{2}{3}。进一步地,若竞猜者坚持原选择,显然 P(R1)=P(A)=1/3P(R_1)=P(A)=1/3;若竞猜者更改选择,定义:

    • 事件 CC 为“除去竞猜者选择的门和主持人打开的门而余下的门后面有小轿车”

    则根据条件概率的定义有 P(CA)=0P(C|A)=0P(CB)=1P(C|B)=1,根据全概率公式有:

    $$\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}$$

    类似的,当 aa 扇门后设有奖品时,事件 AA 发生的概率是 an\dfrac{a}{n}, 事件 BB 发生的概率是 nan\dfrac{n-a}{n},则根据条件概率的定义,当事件 AA 发生时,事件 CC 发生的概率就是在剩余的 nb1n-b-1 扇门中存在奖品的概率,而这 nb1n-b-1 扇门中总共存在 ac1a-c-1 件奖品,因此 P(CA)=ac1nb1P(C|A)=\dfrac{a-c-1}{n-b-1}。同理有 P(CB)=acnb1P(C|B)=\dfrac{a-c}{n-b-1},根据全概率公式,可以得到问题的解:

    $$\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;
    }
    
    • -2
      @ 2023-3-25 17:37:47
      #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
      标签
      递交数
      76
      已通过
      18
      上传者