题目描述
Hz 刚刚学完排列组合,他忍不住开始思考一个很简单的问题:
如果将 n 个不同的小球放入到 m 个不同的盒子中,而且保证每个盒子都不为空,合法的分配方案有多少种呢?
现在请你回答这个问题,由于结果可能会很大,请你将结mod 998244353 后输出。
输入描述:
第一行给定两个整数 n,m (1≤n,m≤5000),其含义如题面所述。
输出描述:
输出一个整数,表示合法方案数。
示例1
输入
3 2
输出
6
示例2
输入
1000 1001
输出
0
解题思路
计算所有可能的分配方式,然后逐步排除不满足条件的情况。使用组合数公式计算从 m 个盒子中选择 k 个盒子为空的情况数目。最后计算幂次模运算。
代码示例
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n,m;
signed main(){
cin >> n >> m;
if(n < m){
cout << 0 << endl;
return 0;
}
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
dp[0][0] = 1;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
dp[i][j] = (j * dp[i-1][j] + dp[i-1][j-1]) % mod;
}
}
int fac = 1;
for(int i = 1;i <= m;i++){
fac = (fac * i) % mod;
}
int ans = (dp[n][m] * fac) % mod;
cout << ans << endl;
return 0;
}