洛谷题单指南-组合数学与计数-CF1278F Cards

原题链接:https://www.luogu.com.cn/problem/CF1278F

题意解读:n次从m张牌里抽一张,一共抽到x次小丑,求xk的期望。

解题思路:

要求xk的期望,即求:image,p是抽到小丑牌x次的概率。

对于n次操作,每次抽中小丑的概率是t=1/m,一共抽中x次的概率符合典型的伯努利实验:image

因此答案是:image,直接算不可行,需要进一步转换,一定要把求和x从1到n给化简掉。

突破口在xk

根据第二类斯特林数与幂的关系:

image

可以借助于普通幂->下降幂的关系将xk替换掉,得到式子并经过一系列转化:

image

注意,t = 1/m,除以mj模mod相当于乘以mj模mod的逆元,mj的逆元为(mj)mod-2 % mod

斯特林数可以通过递推进行初始化:S(n,k) = S(n-1,k-1) + k*S(n-1,k)

n的下降幂也可以预先初始化

100分代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int K = 5005, MOD = 998244353;
LL S[K][K]; //斯特林数
LL facn[K]; //n的下降幂
LL n, m, k, ans;

LL ksm(LL a, LL b, LL mod)
{
    LL res = 1;
    while(b)
    {
        if(b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int main()
{
    cin >> n >> m >> k;
    //预处理斯特林数
    S[0][0] = 1;
    for(LL i = 1; i <= k; i++)
    {
        for(LL j = 1; j <= i; j++)
        {
            S[i][j] = (S[i - 1][j - 1] + j * S[i - 1][j] % MOD) % MOD;
        }
    }
    //预处理n的下降幂
    facn[1] = n;
    for(int i = 2; i <= k; i++)
    {
        facn[i] = facn[i - 1] * (n - i + 1) % MOD;
    }
    //计算答案
    for(LL j = 0; j <= k; j++)
    {
        ans = (ans + S[k][j] * facn[j] % MOD * ksm(m, j * (MOD - 2), MOD) % MOD) % MOD;
    }
    cout << ans;
    return 0;
}

 

posted @ 2025-12-16 17:45  hackerchef  阅读(3)  评论(0)    收藏  举报