3 条题解

  • 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;
    }
    
    • 1
      @ 2024-6-23 7:33:31
      #include<bits/stdc++.h>
      using namespace std;
      int main(){
          cout<<"665496236\n33274812";
          return 0;
      }
      

      暴力出奇迹,我看到只有一个测试点,然后就...了。

      • 0
        @ 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
        标签
        递交数
        85
        已通过
        20
        上传者