CF1096E The Top Scorer 题解

假设有 \(n\) 个人,得分和是 \(m\),得分序列是 \(a\),小明得分是 \(a_1\),第 \(i\) 个人的得分是 \(a_i(2\le i\le n)\)
\(i\) 个人获得冠军是事件 \(A_i\)\(a_i\ge k\) 是事件 \(B_i\)

思路

小明在 \(a_1\ge k\)(事件 \(B_1\))的条件下,获得冠军(事件 \(A_1\)),所以 \(P(A_1|B_1) = \dfrac{P(A_1B_1)}{P(B_1)}\)

考虑计算 \(P(B_1)\),即 \(a_1\ge k\) 的方案数除以所有情况数,用插板法很容易解决,即为:

\[P(B_1) = \dfrac{\binom{m - k + n - 1}{n - 1}}{\binom{m + n - 1}{n - 1}} \]

考虑计算 \(P(A_1B_1)\),即小明获得冠军且 \(a_1\ge k\)

  1. \(P(A_i) = P(A_j)\),我们已经知道一场比赛里面肯定会有一个冠军,所以 \(\sum_{i = 1}^nP(A_i)=1\),所以 \(P(A_1) = \dfrac{1}{n}\)

  2. 可以发现如果 \(\exists a_i\ge k\),那么 \(\max a_i\ge k\),所以 \(P(A_1B_1) = P(A_1)P(\exists a_i \ge k) = \dfrac1n(1-P(\forall a_i < k))\)\(P(\forall a_i < k)\) 可以用容斥计算:

\[P(\forall a_i\ge k) = \dfrac{\sum_{t=0}^n(-1)^i\binom nt\binom{m - ik + n - 1}{n-1}}{\binom{m + n - 1}{n - 1}} \]

总结一下式子,答案就是:

\[P(A_1|B_1) = \dfrac{\dfrac1n(1-P(\forall a_i < k))}{P(B_1)} \]

时间复杂度是 \(O(p + s)\)

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
//#define int long long
using namespace std;
const int N = 2e7 + 10, mod = 998244353;
int n, m, k, fac[N], ifac[N];
int qmi(int a, int b) {
    int res = 1;
    while(b) {
        if(b & 1) res = 1ll * res * a % mod;
        a = 1ll * a * a % mod, b >>= 1;
    }
    return res;
}
void init() {
    fac[0] = ifac[0] = 1;
    for(int i = 1; i < N; i ++) fac[i] = 1ll * fac[i - 1] * i % mod;
    ifac[N - 1] = qmi(fac[N - 1], mod - 2);
    for(int i = N - 2; i; i --) ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;
}
int C(int n, int m) {
    if(n < m || n < 0 || m < 0) return 0;
    return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> n >> m >> k, init();
    int ans = 0, all = 0;
    for(int i = 0; i <= n; i ++) {
        if(m - i * k + n - 1 < 0) break;
        ans = (ans + 1ll * (i & 1 ? -1 : 1) * C(n, i) * C(m - i * k + n - 1, n - 1)) % mod;
    }
    ans = (1 - 1ll * ans * qmi(C(m + n - 1, n - 1), mod - 2) % mod + mod) % mod;
    all = 1ll * C(m + n - 1 - k, n - 1) * qmi(C(m + n - 1, n - 1), mod - 2) % mod;
    cout << 1ll * ans * qmi(1ll * all * n % mod, mod - 2) % mod << '\n';
    
    return 0;
}
posted @ 2025-04-12 16:50  MoyouSayuki  阅读(27)  评论(0)    收藏  举报
:name :name