CF1278F Cards

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;
}
posted @ 2024-01-26 18:34  123wwm  阅读(39)  评论(0)    收藏  举报