组合计数

这里不讨论狭义计数和过于高深的多项式。


斯特林数

两类斯特林数在组合计数中具有重要意义。

第一类斯特林数

定义:

S_1(n,m)表示将n个不同的数划分到m个圆排列的方案数。

递推式:

S_1(n,m)=S_1(n-1,m-1)+(n-1)*S_1(n-1,m)

就是枚举最后一个数是单独一组还是填进其他组。

性质:

1.

S_1(n,1)=(n-1)!

证明:就是n!然后除以n就是圆排列。

2.

\sum_{i=1}^{n}S(n,i)=n!

证明:一个排列对应唯一一个圆排列的划分,具体来说,对于一个排列ip_i连边,必定会形成几个环。

3.

x^\underline{n}=\sum_{i=1}^{n}(-1)^{n-i}S_1(n,i)x^i

证明:数学归纳,当n=1的时候显然成立。

x^\underline{n+1}=(x-n)x^\underline{n}=x*x^\underline{n}+n*x^\underline{n}

=\sum_{i=1}^{n}(-1)^{n-i}S_1(n,i)x^{i+1}-n*\sum_{i=1}^{n}(-1)^{n-i}S_1(n,i)x^i

=\sum_{i=1}^{n+1}(-1)^{n+1-i}S_1(n,i-1)x^{i}-n*\sum_{i=1}^{n+1}(-1)^{n-i}S_1(n,i)x^i

这里解释下上面,i=1时的左边和i=n+1时的右边都是0,只是为了配上一项好看一点。

=\sum_{i=1}^{n+1}(-1)^{n+1-i}[S_1(n,i-1)+n*S_1(n,i)]x^i

=\sum_{i=1}^{n+1}(-1)^{n+1-i}S_1(n+1,i)x^i

这样当n>1的时候也是成立的。

于是一个x的下降幂就被我们表示成了多项式形式了,系数就是一行斯特林数。

求第一类斯特林数

倍增法。先咕着。

第二类斯特林数

定义:

n个数分成m个集合的方案数,集合内于集合间无序。

递推式:

S_2(n,m)=S_2(n-1,m-1)+m*S_2(n-1,m)

同样是考虑每个新加的数是单独占一个还是加进其它的。

应用:

第二类斯特林数主要应用于不同的球扔进各种桶里的问题,这里桶中的元素无序。

1.桶相同,不为空:

此时就是S_2的定义:

S_2(n,m)

2.桶相同,可为空:

枚举扔进几个桶里:

\sum_{i=1}^{m}S_2(n,i)

3.桶不同,不为空:

我们把每个桶编号1-n,相当于就是要乘上一个n的排列。

n!*S_2(n,m)

4.桶不同,可为空:

就是枚举扔几个桶加上排列数。

\sum_{i=1}^{n}S_2(n,i)*P(m,i)

这里换一种方式考虑,相当于每个球可以随意扔进任何一个桶,只要某一步不一样就是不同的方案,那么就有:

\sum_{i=1}^{n}S_2(n,i)*P(m,i)=n^m

求第二类斯特林数

S_2(n,m)=\sum_{i=1}^{m}\frac{k^n(-1)^{m-k}}{k!(m-k)!}

证明的话就是数学归纳,把S_2(n,m)拆成S_2(n-1,m-1)+m*S_2(n-1,m)求解。

可以发现它可以拆成两个多项式的卷积:

f(x)=\frac{x^n}{x!}

g(x)=\frac{(-1)^x}{x!}

于是可以运用FFT/NTTO(nlogn)时间内求解一行斯特林数。

与第一类斯特林数的关系

\sum_{k=1}^{n}S_1(n,k)S_2(k,m)=\sum_{k=1}^{n}S_2(n,k)S_1(k,m)

0%