\(答案=\sum^n_{i=0}*C^i_n*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}*i^k\)
根据第二类斯特林数的性质\(n^k=\sum^k_{i=0}S^i_k*i!*C^i_n=\sum^k_{i=0}S^i_k*n^\underline{i}\)将普通幂转为下降幂
\(=\sum^n_{i=0}C^i_n*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}\sum^k_{j=0}S^j_k*i^\underline{j}\)
\(=\sum^k_{j=0}S^j_k\sum^n_{i=0}C^i_n{\frac{1}{m}}^i{\frac{m-1}{m}}^{n-i}i^\underline{j}\)
把\(C^i_n\)化出来就是\(\frac{n!}{(n-i)!i!}\)
所以\(\frac{n!}{(n-i)!i!}i^\underline{j}=\frac{n!}{(n-i)!(i-j)!}=\frac{(n-j)!n^\underline{j}}{(n-i)!(i-j)!}=C^{i-j}_{n-j}n^\underline{j}\)
答案\(=\sum^k_{j=0}S^j_kn^\underline{j}\sum^n_{i=0}C^{i-j}_{n-j}*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i}\)
\(=\sum^k_{j=0}S^j_kn^\underline{j}{\frac{1}{m}}^{j}\sum^{n-j}_{i=0}C^{i}_{n-j}*{\frac{1}{m}}^i*{\frac{m-1}{m}}^{n-i-j}\)
\(=\sum^k_{j=0}S^j_kn^\underline{j}{\frac{1}{m}}^{j}\)
\(n^2\)预处理第二类斯特林数,其他的可以过程中求
#include <bits/stdc++.h>
using namespace std;
/* freopen("k.in", "r", stdin);
freopen("k.out", "w", stdout); */
// clock_t c1 = clock();
// std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define de(a) cout << #a << " = " << a << endl
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define ls ((x) << 1)
#define rs ((x) << 1 | 1)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
typedef vector<int, int> VII;
#define inf 0x3f3f3f3f
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll MAXN = 5e5 + 7;
const ll MAXM = 1e5 + 7;
const ll MOD = 998244353;
const double eps = 1e-6;
const double pi = acos(-1.0);
ll quick_pow(ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b & 1)
ans = (1LL * ans * a) % MOD;
a = (1LL * a * a) % MOD;
b >>= 1;
}
return ans;
}
ll s[5005][5005];
void go()
{
s[0][0] = 1;
for (int i = 1; i <= 5000; i++)
for (int j = 1; j <= i; j++)
s[i][j] = (s[i - 1][j - 1] + j * s[i - 1][j]) % MOD;
}
int main()
{
ll n, m, k;
go();
scanf("%lld%lld%lld", &n, &m, &k);
ll inv = quick_pow(m, MOD - 2);
ll ans = 0;
ll up = 1;
for (int i = 1; i <= k; i++)
{
(((up *= (n - i + 1)) %= MOD) *= inv) %= MOD;
(ans += s[k][i] * up) %= MOD;
}
printf("%lld\n", ans);
return 0;
}
codeforces 1278F - Cards(第二类斯特林数+二项式)
原文:https://www.cnblogs.com/graytido/p/12213765.html