zoukankan      html  css  js  c++  java
  • 完全不会的斯特林数总结

    第一类斯特林数还不怎么会呢,于是就先写第二类了

    第二类斯特林数

    第二类斯特林数(egin{Bmatrix}n\mend{Bmatrix})表示把(n)个元素分配到(m)个无标号集合的方案数

    递推形式是

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

    就是对于这个新加进来的元素要不然新开一个集合,要不然放到之前的(m)个集合中的一个

    之后这个东西看起来非常容斥啊,于是就有一个喜闻乐见的容斥形式

    [egin{Bmatrix}n\mend{Bmatrix}=frac{1}{m!}sum_{k=0}^m(-1)^kinom{m}{k}(m-k)^n=sum_{k=0}^kfrac{(-1)^k}{k!} imes frac{(m-k)^n}{(m-k)!} ]

    显然是一个卷积形式,于是我们可以在(O(nlgn))时间内卷出一行的第二类斯特林数

    第二类斯特林数比较厉害的一个地方就是和(x^k)是有关系的

    [n^k=sum_{i=1}^kegin{Bmatrix}k\iend{Bmatrix}inom{n}{i}i! ]

    (n^k)的组合意义显然就是把(k)个球放到(n)个盒子里的方案数,于是我们从(n)个盒子里选出(i)个,把(k)个球放进去

    显然(inom{n}{i}i!)就是排列数,于是第二类斯特林数还跟下降幂有关系

    [n^k=sum_{i=1}^kegin{Bmatrix}k\iend{Bmatrix}n^{underline i} ]

    我们利用上面的这个东西还能用来求自然数的幂次方和

    [egin{aligned} &sum_{i=1}^ni^k\ =&sum_{i=1}^nsum_{j=1}^kegin{Bmatrix}k\jend{Bmatrix}inom{i}{j}j!\ =&sum_{j=1}^kegin{Bmatrix}k\jend{Bmatrix}j!sum_{i=1}^ninom{i}{j}\ =&sum_{j=1}^kegin{Bmatrix}k\jend{Bmatrix}j!inom{n+1}{j+1}\ =&sum_{j=1}^kegin{Bmatrix}k\jend{Bmatrix}frac{(n+1)!j!}{(j+1)!(n-j)!}\ =&sum_{j=1}^kegin{Bmatrix}k\jend{Bmatrix}frac{(n+1)^{underline{j+1}}}{j+1} end{aligned} ]

    其中有一步是(sum_{i=1}^ninom{i}{j}=inom{n+1}{j+1})可以理解为从(n+1)里选择(j+1)个,我们枚举第一个选择的位置

    这个东西处理斯特林数之后利用逆元可以做到(O(k)),但是我们每次暴力算(frac{(n+1)^{underline{j+1}}}{j+1})可以不用逆元做到(O(k^2))

    第一类斯特林数

    第一类斯特林数(egin{bmatrix}n\mend{bmatrix})表示把(n)球分成(m)个圆排列的方案数

    递推形式

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

    就是新加进来的这个元素要不然单独成为一个圆排列,要不然跟在之前的(n-1)个元素的后面

    这个东西要是想求一行的话没有像第二类斯特林数那样清爽的容斥形式,不过有一个生成函数

    [prod_{i=0}^{n-1}(x+i) ]

    这个非常显然了,就是把最基本的递推形式用生成函数写了一遍,乘(x)就是(egin{bmatrix}n-1\m-1end{bmatrix})(egin{bmatrix}n\mend{bmatrix})转移,乘上那个(i)就是让(egin{bmatrix}n-1\mend{bmatrix})乘上(n-1)(egin{bmatrix}n\mend{bmatrix})转移

    我们可以用分治乘法+(ntt)做到(O(nlg^2n)),好像还有一个非常牛逼的(O(nlgn))的做法,但是不会了

    第一类斯特林数一个非常重要的性质就是

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

    又把次幂和下降幂扯上了关系

    考虑证明?写不动了,我要抄yyb的

    [egin{aligned}x^{underline{n+1}}&=(x-n)x^{underline n}\ &=(x-n)*sum_{i=0}^negin{bmatrix}n\iend{bmatrix}(-1)^{n-i}x^i\ &=sum_{i=1}^{n+1}egin{bmatrix}n\i-1end{bmatrix}(-1)^{n-i-1}x^{i}-nsum_{i=1}^{n+1}egin{bmatrix}n\iend{bmatrix}(-1)^{n-i}x^{i-1}\ &=sum_{i=0}^{n+1}egin{bmatrix}n\i-1end{bmatrix}(-1)^{n-i-1}x^i+nsum_{i=0}^{n+1}egin{bmatrix}n\iend{bmatrix}(-1)^{n-i+1}x^i\ &=sum_{i=0}^{n+1}(egin{bmatrix}n\i-1end{bmatrix}+n*egin{bmatrix}n\iend{bmatrix})(-1)^{n+1-i}x^i\ &=sum_{i=0}^{n+1}egin{bmatrix}n+1\iend{bmatrix}(-1)^{n+1-i}x^i end{aligned} ]

    斯特林反演

    还是先把柿子搬上去

    如果存在

    [g(n)=sum_{i=0}^negin{Bmatrix}n\iend{Bmatrix}f(i) ]

    就会有

    [f(n)=sum_{i=0}^n(-1)^{n-i}egin{bmatrix}n\iend{bmatrix}g(i) ]

    来一道例题

    给出一个 (n×m) 大小的矩形,每个位置可以填上([1,c])

    中的任意一个数,要求填好后任意两行互不等价且任意两列互不等价,两行或两列等价当且仅当对应位置完全相同,求方案数 。

    (n,m≤5000)

    考虑一下只要求行不相同,列不限制,方案数是多少;由于行的等价类有(c^m)中,所以从这(c^m)种等价类中选(n)的方案就是((c^m)^{underline n})

    (f(m)=(c^m)^{underline n})(g(m))表示(m)列要求行列均不相同的方案,即我们要求的答案

    考虑找一下(f,g)之间的关系,不难写出一个这样的柿子(f(m)=sum_{i=1}^megin{Bmatrix}m\iend{Bmatrix}g(i)),即枚举共有(i)种不同的列,用第二列斯特林数把(m)列分进这(i)种类里去,同时保证了每一列非空;之后大力现在一共只有(i)种本质不同的列了,于是乘一下(g(i))就好了

    现在愉快的斯特林反演即可,(g(m)=sum_{i=0}^m(-1)^{m-i}egin{bmatrix}m\iend{bmatrix}f(i)=sum_{i=0}^m(-1)^{m-i}egin{bmatrix}m\iend{bmatrix}(c^i)^{underline n})

  • 相关阅读:
    多线程2.md
    Python-多线程.md
    Python-Log-note.md
    记账本开发记录——第四天(2020.1.21)
    记账本开发记录——第三天(2020.1.20)
    记账本开发记录——第二天(2020.1.19)
    《构建之法——现代软件工程》读书笔记(一)
    记账本开发记录——第一天(2020.1.18)
    JAVA分级测试——选课系统(补发)
    转专业后补修C语言的一些体会(4)
  • 原文地址:https://www.cnblogs.com/asuldb/p/10917496.html
Copyright © 2011-2022 走看看