zoukankan      html  css  js  c++  java
  • 斯特林数相关

    联合省选的D1T2放出了一道裸的斯特林数,幸亏之前推过第二类斯特林数求自然数幂和,所以很幸运地切了。
    这次比赛之后dyp和gmh77疯狂学斯特林数,从此免疫。
    惊得我也系统地学一下斯特林数做做样子。


    概念

    第一类斯特林数:记为(s(m,n))(也可以用中括号表示),组合意义为(m)个数形成(n)个圆排列的方案数。
    有个比较系统的定义:(s(m,n)=[x^n]prod_{i=0}^{m-1}(x+i))
    性质:
    (s(m,n)=(m-1)*s(m-1,n)+s(m-1,n-1))
    组合意义可证。
    (sum_{k=0}^ns(n,k)=n!)
    每一种排列,对应着一种轮换。意思记排列为(p)(i)(p_i)连边,这样就会形成若干个环。

    第二类斯特林数:记为(S(m,n))(也可以用大括号表示),组合意义为(m)个数形成(n)个集合的方案数。
    性质:
    (S(m,n)=n*S(m-1,n)+S(m-1,n-1))
    组合意义可证。
    (S(m,n)=frac{1}{n!}sum_{k=0}^{n}(-1)^kC(n,k)(n-k)^m)
    反演得到(下面有提及)。
    (sum_{k=0}^nS(n,k)=B_n)
    (B)表示贝尔数。

    有符号斯特林数:顾名思义就是有符号的斯特林数。
    (s_s(m,n)=-(m-1)*s_s(m-1,n)+s_s(m-1,n-1))
    (S_s(m,n)=-n*S_s(m-1,n)+S_s(m-1,n-1))

    下标(s)意思为“signed”

    打个表出来可以发现
    (s_s(m,n)=(-1)^{m-n}s(m,n))
    (S_s(m,n)=(-1)^{m-n}S(m,n))


    性质

    (s(m,n)geq S(m,n))
    排列数大于等于集合数。

    普通幂、上升幂、下降幂相关:(这个在推式子的时候经常能够用到!)
    (x^n=sum_{k=0}^nS(n,k)x^{underline k})
    (x^n=sum_{k=0}^nS(n,k)(-1)^{n-k}x^{overline k}=sum_{k=0}^nS_s(n,k)x^{overline k})
    (x^{overline n}=sum_{k=0}^ns(n,k)x^k)
    (x^{underline n}=sum_{k=0}^ns(n,k)(-1)^{n-k}x^k=sum_{k=0}^ns_s(n,k)x^k)
    具体证明嘛,各种归纳,各种组合意义。


    快速求斯特林数

    第一类斯特林数:
    把定义式搬下来:(s(m,n)=[x^n]prod_{i=0}^{m-1}(x+i))
    (s_m(x)=prod_{i=0}^{m-1}(x+i))
    考虑倍增求这个东西。从(s_m(x))推到(s_{2m}(x))时:
    (s_{2m}(x)=s_{m}(x)s_m(x+m))
    快速求出(s_m(x+m))。设(s_m(x)=sum_{i=0}^ms_{m,i}x^i)。之前已经求出(s_{m,i})
    (s_m(x+m)=sum_{i=0}^ms_{m,i}(x+m)^i)
    二项式展开一下,推一波式子,就可以发现一个卷积。
    于是计算(s_m(x+m))的时间复杂度是(O(mlg m))的。
    由于(m)是两倍两倍地扩大,所以总的时间复杂度也是(O(m lg m))

    第二类斯特林数:
    把上面那个普通幂转下降幂的式子搬下来,简单反演一下,得到:
    (n!S(m,n)=sum_{k=0}^{n}(-1)^kC(n,k)(n-k)^m)
    把后面的那个组合数拆开,可以发现这是个很明显的卷积形式。
    时间复杂度(O(n lg n))


    斯特林反演

    (f(n)=sum_{k=0}^n S(n,k)g(k) Longleftrightarrow g(n)=sum_{k=0}^n(-1)^{n-k}s(n,k)f(k))
    有个叫反转公式的东西:
    (sum_ks(n,k)S(k,m)(-1)^{n-k}=[m=n])
    (sum_kS(n,k)s(k,m)(-1)^{n-k}=[m=n])
    关于这个怎么证明……最严谨的方法应该是归纳。

    写公式太麻烦,直接口胡一下证明的思路(挺好推的)。
    比如上面这条式子:(sum_ks(n,k)S(k,m)(-1)^{n-k}=[m=n])
    先将(s(n,k))用递推式拆开,展开一下。
    再将(S(k,m))用递推式拆开,展开一下。
    照着这么做就可以很自然地归纳证明出来了。
    另一条式子也可以类似地推出来。
    看了一些博客,有些博客里面写了一种不是很严谨的证明方法:
    具体就是取一个普通幂(n^m),将它先用第二类斯特林数表示成下降幂多项式,然后将这个下降幂用第一类斯特林数表示成普通幂。
    推推式子就会得到这样:(n^m=sum_{j=0}^mn^jsum_{k=j}^mS(m,k)s(k,j)(-1)^{j-k})
    然后谁告诉我,这怎么就能直接得到(sum_{k=j}^mS(m,k)s(k,j)(-1)^{j-k}=[j=m])了???
    这种方法只能解释假设反转公式成立,这个东西也成立;但不能反过来推啊……

    如果设矩阵(F_{i,j}=S(i,j))(G_{i,j}=(-1)^{i-j}s(i,j))
    (或者(F_{i,j}=s(i,j))(G_{i,j}=(-1)^{i-j}S(i,j))
    不难发现(F*G=E),即(F)(G)互逆。

    拉赫数(第三类斯特林数?)

    似乎只有维基上略有提及,所以不够详细请见谅。
    有错误请指出。

    无符号拉赫数:
    上升幂和下降幂定义:
    (x^{overline n}=sum_{k=0}^nL(n,k)x^{underline n})
    (x^{underline n}=sum_{k=0}^{n}(-1)^{n-k}L(n,k)x^{overline n})
    递推式定义:(L(m,n)=L(m-1,n-1)+(n-1+m)L(m,n-1))
    矩阵乘法定义:(L(m,n)=sum_k s(m,k)S(k,n))

    有符号拉赫数:
    上升幂和下降幂定义:
    (x^{overline n}=(-1)^nsum_{k=0}^nL_s(n,k)x^{underline n})
    (x^{underline n}=(-1)^ksum_{k=0}^{n}L_s(n,k)x^{overline n})
    (L_s(m,n)=(-1)^mL(m,n))

    性质:
    (L(m,n)=C(m-1,n-1)frac{m!}{n!})
    归纳可证:
    (sum_kL_s(m,k)L_s(k,n)=sum_k(-1)^{m-k}L(m,k)L(k,n)=[m=n])
    (L(n,k)=n![x^n]frac{1}{k!}(frac{x}{1-x})^k)


    参考资料

    https://www.cnblogs.com/Wuweizheng/p/8638858.html
    https://www.cnblogs.com/hchhch233/p/10016543.html
    https://www.cnblogs.com/owenyu/p/6724661.html
    https://www.cnblogs.com/gzy-cjoier/p/8426987.html
    百度百科
    维基百科

  • 相关阅读:
    Thread
    C# Iterations: IEnumerator, IEnumerable and Yield
    基于SharePoint 2010 创建一个简单的工作流
    利用with关键字实现数据查询的递归调用
    编写JQuery插件示例
    生成密码web小工具
    (转)关于SQL Server 中合并行的方法
    html5做的割绳子游戏
    SharePoint Foundation和SharePoint Server的区别
    如何实现基于AD的MOSS的FORM认证方式
  • 原文地址:https://www.cnblogs.com/jz-597/p/13210825.html
Copyright © 2011-2022 走看看