stirling数
将n个有区别的球的球放入k个无标号的盒子中( n>=k>=1,且盒子不允许为空)的方案数就是stirling数.(即含 n 个元素的集合划分为 k 个集合的情况数)
递推公式:
S(n,0) = 0
S(n,1) = 1 (k = 1)
S(n,n) = 1
S(n,k) = 0 (k > n)
S(n,k) = S(n-1,k-1)+k*S(n-1,k) (n >= k >= 2)
分析:设有n个不同的球,分别用b1,b2,...,bn表示。从中取出一个球bn,bn的放法有以下两种:
1.bn独占一个盒子,那么剩下的球只能放在k-1个盒子里,方案数为S(n-1,k-1);
2.bn与别的球共占一个盒子,那么可以将b1,b2,...,bn-1这n-1个球放入k个盒子里,然后将bn放入其中一个盒子中,方案数为k*S(n-1,k).
附程序:
program stirling;
var f:array[0..10000,0..10000] of longint;
n,m,i,j:longint;
begin
readln(n,m);
for i:=1 to n do
begin
f[i,0]:=0;
f[i,1]:=1;
f[i,i]:=1;
for j:=i+1 to n do f[i,j]:=0;
end;
for i:=2 to n do
begin
for j:=2 to m do
f[i,j]:=j*f[i-1,j]+f[i-1,j-1];
end;
writeln(f[n,m]);
end.