zoukankan      html  css  js  c++  java
  • 斯特林数小结

    斯特林数小结

    第一类斯特林数

    定义

    (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)个数就可以随意选择集合插入了。

    斯特林数的求法

    下篇博客再讲。

  • 相关阅读:
    conda使用
    onedrive共享文件的下载
    生物信息软件安装(不定时更新)
    if 的常见问题解析
    C语言常见的误区
    流程控制
    C语言中的运算符
    scanf的具体用法
    代码的规范
    printf中的x%及用法
  • 原文地址:https://www.cnblogs.com/tqxboomzero/p/14591723.html
Copyright © 2011-2022 走看看