///定义:
/*
排列组合解决球盒的八大问题,其中用到排列组合公式和第二类斯特林公式
*/
///扩展:
/*
(1)8种类型的公式
N球,M盒,由于球是否相同,盒是否相同,盒是否可以为空,共2^3=8种:
1 、球同,盒同,盒不可以为空 Pm(N)--这符号表示部分数为m的N-分拆的个数,m是P的下标,为了好看我将大写的M弄成小写
2、球同,盒同,盒可以为空 Pm(N+M)--为什么要加M,与4为什么要在3的基础上加M是一样的,就是为了保证不为空
首先要记得:
P1(n)=1 , Pn(n)=1, Pn-1(n)=1
P2(n)=[n/2] --[]表示不超过n/2的最大整数
Pn+1(n)=0 --或者表示没意义,因为n个球要放到n+1个盒子中,又不允许为空,没意义。
公式:Pm(N)=P1(N-m)+P2(N-m)+P3(N-m)+......+Pm(N-m) ------(共M项)
3、球同,盒不同,盒不可以为空 C(N-1, M-1)
4、球同,盒不同,盒可以为空 C(N+M-1, M-1)
5、球不同,盒同,盒不可以为空 S(N, M) --第二类斯特林数
6、球不同,盒同,盒可以为空 S (N, 1) + S(N, 2) + S(N, 3) + ... + S(N, M)
S(r, c) = S(r-1,c-1) + c * S(r-1, c)
7、球不同,盒不同,盒不可以为空 M! * S(N, M)
8、球不同,盒不同,盒可以为空 M^N --表示M的N次方
(2)排列组合公式:
C(n,m) = n!/((n-m)!m!)
*/
/*
排列组合解决球盒的八大问题,其中用到排列组合公式和第二类斯特林公式
*/
///代码:
/*
**name:第二类斯特林数(第二类Stirling数)
**function:解决求不同盒同等问题
**公式: S(r, c) = S(r-1,c-1) + c * S(r-1, c)
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAXN 10
using namespace std;
const int MOD = 1e9+7;
int s[MAXN][MAXN];
void Get_Stirling(){
memset(s,0,sizeof(s));
for(int i = 1;i<=MAXN;i++){
s[i][1 ] = s[i][i ] =1;
for(int j = 2;j<i;j++){
s[i][j] = (s[i-1][j-1] + (long long)j*s[i-1][j]%MOD)%MOD;
}
}
}
int main(){
Get_Stirling();
return 0;
}
///扩展:
/*
(1)8种类型的公式
N球,M盒,由于球是否相同,盒是否相同,盒是否可以为空,共2^3=8种:
1 、球同,盒同,盒不可以为空 Pm(N)--这符号表示部分数为m的N-分拆的个数,m是P的下标,为了好看我将大写的M弄成小写
2、球同,盒同,盒可以为空 Pm(N+M)--为什么要加M,与4为什么要在3的基础上加M是一样的,就是为了保证不为空
首先要记得:
P1(n)=1 , Pn(n)=1, Pn-1(n)=1
P2(n)=[n/2] --[]表示不超过n/2的最大整数
Pn+1(n)=0 --或者表示没意义,因为n个球要放到n+1个盒子中,又不允许为空,没意义。
公式:Pm(N)=P1(N-m)+P2(N-m)+P3(N-m)+......+Pm(N-m) ------(共M项)
3、球同,盒不同,盒不可以为空 C(N-1, M-1)
4、球同,盒不同,盒可以为空 C(N+M-1, M-1)
5、球不同,盒同,盒不可以为空 S(N, M) --第二类斯特林数
6、球不同,盒同,盒可以为空 S (N, 1) + S(N, 2) + S(N, 3) + ... + S(N, M)
S(r, c) = S(r-1,c-1) + c * S(r-1, c)
7、球不同,盒不同,盒不可以为空 M! * S(N, M)
8、球不同,盒不同,盒可以为空 M^N --表示M的N次方
(2)排列组合公式:
C(n,m) = n!/((n-m)!m!)
*/