zoukankan      html  css  js  c++  java
  • 「不会」斯特林数

    照例是不会的东西但是又不想一点印象都留不下于是抄一遍

      

      从前有两张表,

      一张是斯特林打的,表上的(S_1(i,j))表示(i)个元素形成(j)个圆排列的方案数

      叫做第一类斯特林数(egin{bmatrix}n\mend{bmatrix})

      另一张也是斯特林打的,(S_2(i,j))表示(i)个元素放进(j)个集合的方案数

      叫第二类斯特林数(egin{Bmatrix}n\mend{Bmatrix})

      递推公式

    [egin{bmatrix}n\mend{bmatrix} = egin{bmatrix}n-1\m-1end{bmatrix} + (n-1)*egin{bmatrix}n-1\mend{bmatrix} ]

    [egin{Bmatrix}n\mend{Bmatrix}= egin{Bmatrix}n-1\m-1end{Bmatrix}+ m*egin{Bmatrix} n-1\mend{Bmatrix} ]

        就是讨论最后一个加进的元素放进之前的组合中还是独立成为一个组合的问题

      求法
        对于第一类,可使用生成函数求出n这一行的S1

    [prodlimits_{i=0}^{n-1} (x+i)=sumlimits_{i=0}^n egin{bmatrix}n\iend{bmatrix} x^i ]

        对于第二类,枚举空集合的过程容斥求出n这一行的S2

    [egin{Bmatrix}n\mend{Bmatrix}=frac{1}{m!}sumlimits_{i=0}^m (-1)^i C_m^i (m-i)^n ]

        如何理解这个东西呢...被hack了发现自己根本没有理解
        考虑把(m!)乘到左边因为右边如果不拆组合数就没有(m)相关的量了
        所以左边把集合有序化之后就成了不同的n个元素放入不同的m个集合中的方案数了
        再考虑右侧,先选出(k-i)个可放集合再把每个元素放在哪个地方都枚举一遍
        一样是有序集合,因为一种方案中不同编号集合的内容交换算作另一种方案了

      一点性质
        第一类斯特林:表示阶乘

    [n!=sumlimits_{i=0}^n egin{bmatrix}n\iend{bmatrix} ]

        可从枚举轮换数表示置换总数量的角度理解
        普通幂表示下降幂

    [x^{underline n}=sumlimits_{i=0}^n (-1)^{n-i} egin{bmatrix}n\iend{bmatrix} x^i ]

        普通幂表示上升幂

    [x^{overline n}=sumlimits_{i=0}^n egin{bmatrix}n\iend{bmatrix} x^i ]

        第二类斯特林:下降幂表示普通幂

    [m^n=sumlimits_{i=0}^m egin{Bmatrix}n\iend{Bmatrix} m^{underline i} ]

        枚举了非空的集合,而且强制集合有序了。因为左侧的幂是集合带编号的方案数,
        右侧下降幂的形式也是应该是带编号集合的方案数

      斯特林反演? 一点都不会,先咕

    一个例题
    http://hzoj.com/contest/126/problem/11
    原始柿子都列不出来的我流下了不学武术的泪水。
    希望能起到积累的效果。

    不用想的太麻烦,角度不要太偏,就直接单独计算每个点每个值会出现多少次
    每个点大概是等价的

    [egin{aligned}\ ans&=n*sumlimits_{i=0}^{n-1} i^k*C_{n-1}^i*2^{C_n^2-n+1}\ &=n*2^{C_n^2-n+1}*sumlimits_{i=0}^{n-1} C_{n-1}^i*i^k\ end{aligned} ]

    (G(n)=sumlimits_{i=0}^{n} C_{n}^i*i^k),则(ans=n*2^{C_n^2-n+1}*G(n-1))
    于是只需要求(G(n)),为了降低时间需要把循环上界从n转移到k
    所以必须把k从指数弄下来,用到了第二类斯特林数下降幂表示普通幂

    [egin{aligned}\ G(n)&=sumlimits_{i=0}^n i^k*C_n^i\ &=sumlimits_{i=0}^n sumlimits_{j=0}^i egin{Bmatrix}k\jend{Bmatrix}*C_i^j*j!*C_n^i\ end{aligned} ]

    为了方便可以把上界强行改成k反正大于i的部分后面的部分都是0..

    [egin{aligned}\ G(n)&=sumlimits_{i=0}^n sumlimits_{j=0}^k egin{Bmatrix}k\jend{Bmatrix}*C_i^j*j!*C_n^i\ &=sumlimits_{j=0}^k egin{Bmatrix}k\jend{Bmatrix}*j! sumlimits_{i=0}^n C_i^j*C_n^i\ end{aligned}\ ]

    发现后面两个相乘的组合数都和i有关就很不爽,大力乱搞一下

    [G(n)=sumlimits_{j=0}^k egin{Bmatrix}k\jend{Bmatrix}*j! sumlimits_{i=0}^n C_n^j*C_{n-j}^{i-j} ]

    把和i无关的放到前面来

    [G(n)=sumlimits_{j=0}^k egin{Bmatrix}k\jend{Bmatrix}*j!*C_n^j sumlimits{i=0}^n C_{n-j}^{i-j} ]

    发现后面的(sum)是一行组合数,即(2^{n-j})

    [G(n)=sumlimits_{j=0}^k egin{Bmatrix}k\jend{Bmatrix}*j!*C_n^j*2^{n-j} ]

    于是已经不存在上界为n的循环了
    然后剩下的柿子居然只剩下了一行第二类斯特林数,其余项都可以快速幂或递推直接得出
    于是直接求出了...

  • 相关阅读:
    java synchronized
    Java多线程的常见例子
    List,ArrayList
    BufferedInputStream与BufferedOutputStream
    super,this
    ServletConfig与ServletContext
    [转] 编写高效的 CSS 选择器
    浏览器是怎样工作的:渲染引擎,HTML解析
    sublime插件insertDate显示ISO时间
    《十日谈》摘要1
  • 原文地址:https://www.cnblogs.com/yxsplayxs/p/12027896.html
Copyright © 2011-2022 走看看