洛谷题单指南-组合数学与计数-CF1278F Cards
原题链接:https://www.luogu.com.cn/problem/CF1278F
题意解读:n次从m张牌里抽一张,一共抽到x次小丑,求xk的期望。
解题思路:
要求xk的期望,即求:
,p是抽到小丑牌x次的概率。
对于n次操作,每次抽中小丑的概率是t=1/m,一共抽中x次的概率符合典型的伯努利实验:![]()
因此答案是:
,直接算不可行,需要进一步转换,一定要把求和x从1到n给化简掉。
突破口在xk
根据第二类斯特林数与幂的关系:

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

注意,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;
}
浙公网安备 33010602011771号