CF1278F Cards
枚举出现了多少次王牌:
\[ans=\sum_{i=0}^ni^k{n\choose i}(\frac{1}{m})^i(\frac{m-1}{m})^{n-i}
\]
\[=\sum_{i=0}^ni^k{n\choose i}\frac{(m-1)^{n-i}}{m^n}
\]
\[=\frac{1}{m^n}\sum_{i=0}^ni^k{n\choose i}(m-1)^{n-i}
\]
因为有 \(m^n=\sum_{i=0}^{m}\left\{_i^n\right\}m^{\underline i}=\sum_{i=0}^{m}\left\{_i^n\right\}{m\choose i}i!\)
所以
\[ans=\frac{1}{m^n}\sum_{i=0}^n{n\choose i}(m-1)^{n-i}\sum_{j=0}^{k}\left\{_j^k\right\}{i\choose j}j!
\]
\[=\frac{1}{m^n}\sum_{i=0}^n\sum_{j=0}^k{n\choose i}{i\choose j}(m-1)^{n-i}\left\{_j^k\right\}j!
\]
\[=\frac{1}{m^n}\sum_{i=0}^n\sum_{j=0}^k{n\choose j}{n-j\choose i-j}(m-1)^{n-i}\left\{_j^k\right\}j!
\]
\[=\frac{1}{m^n}\sum_{j=0}^k{n\choose j}\left\{_j^k\right\}j!\sum_{i=0}^n{n-j\choose i-j}(m-1)^{n-i}
\]
\[=\frac{1}{m^n}\sum_{j=0}^k{n\choose j}\left\{_j^k\right\}j!\sum_{i=j}^n{n-j\choose i-j}(m-1)^{n-i}
\]
\[=\frac{1}{m^n}\sum_{j=0}^k{n\choose j}\left\{_j^k\right\}j!\sum_{i=0}^{n-j}{n-j\choose i}(m-1)^{n-j-i}
\]
\[=\frac{1}{m^n}\sum_{j=0}^k{n\choose j}\left\{_j^k\right\}j!m^{n-j}
\]
\[=\frac{1}{m^n}\sum_{j=0}^kn^{\underline k}\left\{_j^k\right\}m^{n-j}
\]
至此,此题可以用 \(O(k^2)\) 求出答案,可以通过本题。
code:
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define ll long long
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') f = c == '-' ? -1 : f, c = getchar();
while (c >= '0' && c <= '9') x = (x<<3)+(x<<1)+(c^48), c = getchar();
return x*f;
}
inline void write(int x) {
if (x < 0) x = -x, putchar('-');
if (x > 9) write(x/10);
putchar('0'+x%10);
}
const int N = 5005, mod = 998244353;
int n, m, k, sum, fac[N], ifac[N], s[N][N];
void pls(int &x, int y) { x = (x+y)%mod; }
void sub(int &x, int y) { x = (x-y+mod)%mod; }
int qpow(int x, int y) {
if (y < 0) return 0;
int res = 1;
for (; y; y >>= 1, x = 1ll*x*x%mod) if (y&1) res = 1ll*res*x%mod;
return res;
}
int c(int x, int y) {
if (x < 0 || y < 0 || x < y) return 0;
return 1ll*fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}
void init(int n) {
// fac[0] = 1;
// for (int i = 1; i <= n; ++i) fac[i] = 1ll*fac[i-1]*i%mod;
// ifac[n] = qpow(fac[n], mod-2);
// for (int i = n-1; ~i; --i) ifac[i] = 1ll*ifac[i+1]*(i+1)%mod;
s[1][1] = 1;
for (int i = 2; i <= n; ++i)
for (int j = 1; j <= i; ++j)
s[i][j] = (s[i-1][j-1]+1ll*j*s[i-1][j]%mod)%mod;
}
int main() {
n = read(), m = read(), k = read();
init(k);
for (int i = 0; i <= k; ++i) {
int res = 1;
for (int j = n-i+1; j <= n; ++j) res = 1ll*res*j%mod;
pls(sum, 1ll*res*s[k][i]%mod*qpow(m, n-i)%mod);
}
write(1ll*sum*qpow(qpow(m, n), mod-2)%mod);
return 0;
}