题目描述
现有 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。
思路:是斯特林数
斯特林数链接
https://baike.baidu.com/item/%E6%96%AF%E7%89%B9%E6%9E%97%E6%95%B0/4938529?fr=aladdin
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
long long f(long long x,long long y)
{
if(y<=0||x<y)
return 0;
if(x==y)
return 1;
else
return f(x-1,y-1)+f(x-1,y)*y;
}
int main()
{
long long n,q;
cin>>n>>q;
long long sum=1;
for(int i=1;i<=q;i++)
sum*=i;
cout<<sum*f(n,q);
return 0;
}