P1287 盒子与球
题目描述
现有 rr 个互不相同的盒子和 nn 个互不相同的球,要将这 nn 个球放入 rr 个盒子中,且不允许有空盒子。请求出有多少种不同的放法。
两种放法不同当且仅当存在一个球使得该球在两种放法中放入了不同的盒子。
输入格式
输入只有一行两个整数,分别代表 nn 和 rr。
输出格式
输出一行一个整数代表答案。
输入输出样例
输入 #1
3 2
输出 #1
6
说明/提示
样例输入输出 1 解释
有两个盒子(编号为 1, 21,2)和三个球(编号为 1, 2, 31,2,3),共有六种方案,分别如下:
| 盒子编号 | 方案 1 | 方案 2 | 方案 3 | 方案 4 | 方案 5 | 方案 6 |
|---|---|---|---|---|---|---|
| 盒子 11 | 小球 11 | 小球 22 | 小球 33 | 小球 2, 32,3 | 小球 1, 31,3 | 小球 1, 21,2 |
| 盒子 22 | 小球 2, 32,3 | 小球 1, 31,3 | 小球 1, 21,2 | 小球 11 | 小球 22 | 小球 33 |
数据规模与约定
对于 100\%100% 的数据,保证 0 \leq r \leq n \leq 100≤r≤n≤10,且答案小于 2^{31}231。
// 第二类斯特林数 #include<bits/stdc++.h> using namespace std; const int MAXN = 17; typedef long long LL; LL dp[MAXN][MAXN], fac[MAXN]; void init() { dp[1][1] = fac[0] = fac[1] = 1; for (int i = 2; i < MAXN; i++) { for (int j = 1; j < MAXN; j++) { dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j; } fac[i] = fac[i - 1] * i; } } int main() { int n, r; init(); cin >> n >> r; cout << dp[n][r] * fac[r] << endl; return 0; }

浙公网安备 33010602011771号