斯特林数小结
第一类斯特林数
定义
(left[egin{matrix}n\mend{matrix}
ight]) 表示将(n)个带标号的元素放入(m)个不带标号的环的方案数。
递推式
[left[egin{matrix}n\mend{matrix}
ight]=left[egin{matrix}n-1\m-1end{matrix}
ight]+(n-1)left[egin{matrix}n-1\mend{matrix}
ight]
]
证明考虑组合意义,加号前表示第(n)个元素放入一个新的环,加号后表示跟在之前某一个数后面加入它所在的环。
初始值为
[left[egin{matrix}n\0end{matrix}
ight]=[n=0]
]
因此我们可以(mathcal O(n^2))递推得到第一类斯特林数。
另一个递推式:
[left[egin{matrix}n\mend{matrix}
ight]=sum_{i=1}^{n}left[egin{matrix}n-i\m-1end{matrix}
ight]inom{n-1}{i-1}(i-1)!
]
证明考虑枚举第(n)号元素所在环的大小。
性质
1.(left[egin{matrix}n\kend{matrix}
ight])可以看作由(n)个元素组成的含(k)个轮换的排列数,因此总和即为(n!)
[sum_{k=0}^{n}left[egin{matrix}n\kend{matrix}
ight]=n!
]
2.第一类斯特林数实际上是(x^overline{n})的系数,即:
[x^{overline{n}}=sum_{i=0}^{n}left[egin{matrix}n\iend{matrix}
ight]x^i
]
证明考虑数学归纳法。
利用这一性质,我们可以(mathcal O(nlog(n)))的时间求出第一类斯特林数的一行了,具体参见(一个博客地址)
第二类斯特林数
定义
(left{egin{matrix}n\mend{matrix}
ight}) 表示将(n)个带标号的元素放入(m)个不带标号的集合的方案数。
递推式
[left{egin{matrix}n\mend{matrix}
ight}=left{egin{matrix}n-1\m-1end{matrix}
ight}+mleft{egin{matrix}n-1\mend{matrix}
ight}
]
考虑组合意义,第(n)个元素要么自己是一个集合,要么选择之前的一个集合放进去。
边界条件也是
[left{egin{matrix}n\0end{matrix}
ight}=[n=0]
]
因此也可以(mathcal O(n^2))递推。
同样考虑枚举第(n)个元素所在集合的大小,可以得到递推式:
[left{egin{matrix}n\mend{matrix}
ight}=sum_{i=1}^{n}left{egin{matrix}n-i\m-1end{matrix}
ight}inom{n-1}{i-1}
]
通项公式
[left{egin{matrix}n\mend{matrix}
ight}=dfrac{1}{m!}sum_{k=0}^{m}(-1)^kinom{m}{k}(m-k)^n
]
证明就是先给(m)个集合赋一个标号,最后再除(m!),然后随机放数,通过容斥有几个集合是空的来得到方案数。
利用这个通项公式,我们直接卷积就能在(mathcal O(nlog(n)))的时间内就是第二类斯特林数的一行了。
性质
我们可以利用第二类斯特林数将次幂转为下降幂:
[x^n=sum_{i=0}^{n}left{egin{matrix}n\iend{matrix}
ight}x^{underline{i}}
]
证明考虑组合意义,左侧的组合意义是在 (x) 个数中进行 (n) 次选择的方案数,右侧则是枚举一共选了 (i) 个不同的数,那么相当于将 (n) 次选择分成了 (i) 个集合,(x^{underline{i}})就是从 (x) 个数中选出 (i) 个的方案。
斯特林数的一些恒等式
上文已经给出的:
[x^{overline{n}}=sum_{i=0}^{n}left[egin{matrix}n\iend{matrix}
ight]x^i\
x^n=sum_{i=0}^{n}left{egin{matrix}n\iend{matrix}
ight}x^{underline{i}}
]
斯特林数与幂的更多关系:
[x^n=sum_{i=0}^{n}(-1)^{n-i}left{egin{matrix}n\iend{matrix}
ight}x^{overline{i}}\
x^{underline{n}}=sum_{i=0}^{n}(-1)^{n-i}left[egin{matrix}n\iend{matrix}
ight]x^i
]
证明考虑将(x^{underline{n}})展开,并对每一项系数进行(dp),发现递归式的转移与斯特林数一样。
将这些公式相互代入得到:
[sum_{k=m}^{n}(-1)^{n-k}left[egin{matrix}n\kend{matrix}
ight]left{egin{matrix}k\mend{matrix}
ight}=[n=m]\
sum_{k=m}^{n}(-1)^{k-m}left{egin{matrix}n\kend{matrix}
ight}left[egin{matrix}k\mend{matrix}
ight]=[n=m]
]
进而得到斯特林反演:
[f(n)=sum_kleft{egin{matrix}n\kend{matrix}
ight}g(k)Leftrightarrow g(n)=sum_k(-1)^{n-k}left[egin{matrix}n\kend{matrix}
ight]f(k)\
f(n)=sum_kleft[egin{matrix}n\kend{matrix}
ight]g(k)Leftrightarrow g(n)=sum_k(-1)^{n-k}left{egin{matrix}n\kend{matrix}
ight}f(k)\
]
另一类重要恒等式:
[left[egin{matrix}n+1\m+1end{matrix}
ight]=sum_{k=m}^{n}left[egin{matrix}n\kend{matrix}
ight] inom{k}{m}
]
证明考虑第一类斯特林数的一个环可以看作是一个循环置换,可以认为前 (n) 个 数组成了(k)个置换,然后第(n+1)个数将其中(k-m)个置换接上最终变成了一个循环置换。
[left{egin{matrix}n+1\m+1end{matrix}
ight}=sum_{k=m}^{n}left{egin{matrix}k\mend{matrix}
ight} inom{n}{k}\
left[egin{matrix}n+1\m+1end{matrix}
ight]=sum_{k=m}^{n}left[egin{matrix}k\mend{matrix}
ight] n^{underline{n-k}}
]
证明考虑枚举最后一个数所在的集合/环。
[left{egin{matrix}n+1\m+1end{matrix}
ight}=sum_{k=m}^{n}left{egin{matrix}k\mend{matrix}
ight} (m+1)^{n-k}\
]
考虑将(n+1)个数依次选择是新建一个集合还是加入之前集合,设在第(k+1)个数插入时,第一次出现了(m+1)个集合,剩下的(n-k)个数就可以随意选择集合插入了。
斯特林数的求法
下篇博客再讲。