指数型生成函数(二):贝尔数、无向连通图计数、弱连通DAG计数

贝尔数:n个元素的集合的划分的个数

注意到S2的定义就是n个元素放入k个无区别的盒子的个数,“集合”是一种无区别的盒子,所以贝尔数等于一行S2的和。

定义dp[n]为所求,则考虑1号元素所在集合的元素个数:
d p [ n ] = ∑ i = 1 n d p [ n − i ] ∗ C n − 1 i − 1 = ∑ i = 0 n − 1 d p [ n − 1 − i ] ∗ C n − 1 i , d p [ 0 ] = 1 dp[n]=\sum_{i=1}^ndp[n-i]*C_{n-1}^{i-1}=\sum_{i=0}^{n-1}dp[n-1-i]*C_{n-1}^i,dp[0]=1 dp[n]=i=1ndp[ni]Cn1i1=i=0n1dp[n1i]Cn1i,dp[0]=1
把另一个数组看成全1,则这个式子和引出指数型生成函数(下称EGF)的关键式子(下称①式)
h n = ∑ i = 0 n C n i ∗ f i ∗ g n − i h_n=\sum_{i=0}^nC_n^i*f_i*g_{n-i} hn=i=0nCnifigni
很像,即W(x)e^x有关。w[n]=h[n-1],h对应EGFW(x)*e^x。考虑一条性质:
∫ F ( x ) d x = C + ∑ i > = 1 f i − 1 i ! ∗ x i \int F(x) dx=C+\sum_{i>=1}\frac{f_{i-1}}{i!}*x^i F(x)dx=C+i>=1i!fi1xi
那么为了让h[n-1]移动到x^n的位置,我们需要对h对应的函数积分1次。又dp[0]=1,故
W ( x ) = 1 + ∫ W ( x ) ∗ e x d x W(x)=1+\int W(x)*e^xdx W(x)=1+W(x)exdx
求个导得到
l n W ( x ) = e x + C lnW(x)=e^x+C lnW(x)=ex+C
上面省略了纯微积分问题的推倒过程,因为过于显然过程只需要用到一个结论:
[ l n F ( x ) ] ′ = F ′ ( x ) F ( x ) [lnF(x)]'=\frac{F'(x)}{F(x)} [lnF(x)]=F(x)F(x)
W(0)=dp[0]=1C=-1

无向连通图计数

注:洛谷上题目:城市规划

g[n]为所求。发现直接求没思路,所以考虑求“至少2个连通块”的,再做差。如何构造至少2个连通块?我们发现1号点,必然处于某个连通块里,所以不妨枚举1号点所在的连通块的大小i=1~n-1
g [ n ] = 2 C ( n , 2 ) − ∑ i = 1 n − 1 C n − 1 i − 1 ∗ g [ i ] ∗ 2 C ( n − i , 2 ) g[n]=2^{C(n,2)}-\sum_{i=1}^{n-1}C_{n-1}^{i-1}*g[i]*2^{C(n-i,2)} g[n]=2C(n,2)i=1n1Cn1i1g[i]2C(ni,2)
这玩意和①式很像,但求和项只有n-1项,不好做。但我们发现,i=n的情况恰好可得g[n]。于是
2 C ( n , 2 ) = ∑ i = 1 n C n − 1 i − 1 ∗ g [ i ] ∗ 2 C ( n − i , 2 ) = ∑ i = 0 n − 1 C n − 1 i ∗ g [ i + 1 ] ∗ 2 C ( n − 1 − i , 2 ) 2^{C(n,2)}=\sum_{i=1}^{n}C_{n-1}^{i-1}*g[i]*2^{C(n-i,2)}=\sum_{i=0}^{n-1}C_{n-1}^{i}*g[i+1]*2^{C(n-1-i,2)} 2C(n,2)=i=1nCn1i1g[i]2C(ni,2)=i=0n1Cn1ig[i+1]2C(n1i,2)
f[n]=2^C(n,2)的EGF为F(x)g0[i]=g[i+1]的EGF为G0(x),则
F ( x ) = C 0 + ∫ F ( x ) ∗ G 0 ( x ) d x , G 0 ( x ) = G ′ ( x ) F(x)=C0+\int F(x)*G0(x)dx,G0(x)=G'(x) F(x)=C0+F(x)G0(x)dxG0(x)=G(x)
求导得
[ l n F ( x ) ] ′ = G ′ ( x ) [lnF(x)]'=G'(x) [lnF(x)]=G(x)
值得注意的是,幸好不定积分加C的常数项只影响g[0],所以直接对F(x)套多项式求ln的模板即可。

弱连通DAG计数

传送门:https://www.luogu.com.cn/problem/P6295

弱连通DAG:有向边换成无向边以后是连通图的那些DAG。

先考虑怎么求DAG个数。设f[n]为所求。考虑一个巧妙的DAG构造过程:设现在有一个n-i个点的DAG,我们从i个点向n-i个点任意连边。但我们发现,我们这么做并不能保证那i个点就是所有入度为0的点。为了指定入度为0的点,考虑定义集合A = {p1,p2,...,p[m]}为,指定A集合的点必须入度为0,其他点无限制的DAG个数。则f[n]等于所有可能的集合A的并集的大小(注:集合A非空,因为入度为0的点必须至少有1个)。套容斥原理公式:
f [ n ] = ∑ i = 1 n ( − 1 ) i + 1 ∗ C n i ∗ 2 i ∗ ( n − i ) ∗ f [ n − i ] , f [ 0 ] = 1 f[n]=\sum_{i=1}^n (-1)^{i+1}*C_n^i*2^{i*(n-i)}*f[n-i],f[0]=1 f[n]=i=1n(1)i+1Cni2i(ni)f[ni]f[0]=1
in-i不应该绑定,考虑解绑:
i ∗ ( n − i ) = C ( n , 2 ) − C ( i , 2 ) − C ( n − i , 2 ) i*(n−i)=C(n,2)-C(i,2)-C(n-i,2) i(ni)=C(n,2)C(i,2)C(ni,2)
这个等式的组合意义很简单,把n个元素划分为in-i,n中选2的每种可能情况都枚举一遍。
f [ n ] = ∑ i = 1 n ( − 1 ) i + 1 2 C ( i , 2 ) ∗ i ! ∗ ( n ! ∗ 2 C ( n , 2 ) ) ∗ f [ n − i ] 2 C ( n − i , 2 ) ∗ ( n − i ) ! f[n]=\sum_{i=1}^n \frac{(-1)^{i+1}}{2^{C(i,2)}*i!}*(n!*2^{C(n,2)})* \frac{f[n-i]}{2^{C(n-i,2)}*(n-i)!} f[n]=i=1n2C(i,2)i!(1)i+1(n!2C(n,2))2C(ni,2)(ni)!f[ni]
n!*2^C(n,2)除过去,可设
F ( x ) = ∑ n > = 0 f [ n ] 2 C ( n , 2 ) ∗ n ! F(x)=\sum_{n>=0}\frac{f[n]}{2^{C(n,2)}*n!} F(x)=n>=02C(n,2)n!f[n]

G ( x ) = ∑ n > = 0 ( − 1 ) n + 1 2 C ( n , 2 ) ∗ n ! G(x)=\sum_{n>=0}\frac{(-1)^{n+1}}{2^{C(n,2)}*n!} G(x)=n>=02C(n,2)n!(1)n+1

我们希望补充i=0的项:-1(使得它完全是个多项式乘法),故记F0(x)=F(x)-1,则
F 0 ( x ) = F ( x ) − 1 = F ( x ) ∗ G ( x ) = > F ( x ) = 1 1 − G ( x ) F0(x)=F(x)-1=F(x)*G(x) => F(x)=\frac{1}{1-G(x)} F0(x)=F(x)1=F(x)G(x)=>F(x)=1G(x)1
套多项式求逆模板即可(PS:之前还忘记拆分C(n,i),真的太菜了QAQ)。

DAG与弱连通DAG的关系,和无向图与连通无向图的关系,是一样的,所以对f[n]的EGF,记为F1(x),套多项式求ln的模板,即可得答案数列的EGF。(②)

我只是推倒公式,代码就不写了。因此只给出神犇的代码:https://www.luogu.com.cn/paste/pd9wir1e

参考神犇的blog:https://blog.csdn.net/qq_34940287/article/details/107191864

②的一个理解

摘自:https://www.luogu.com.cn/blog/lx-2003/generating-function-advanced

对于其他东西而不只是非空子集,也可以由类似的解释搞出一个exp。抽象一下,就是要把n个有标号的球放到任意多个无标号的盒子里,并且一个放有k个球的盒子有a[k]种染色方案,那么放球并染色的方案就是e^A(x)

A(x)=sum(ans[n]/n!*x^n)为弱连通DAG答案数列的EGF,则e^A(x)表示把n个点划分为任意多个弱连通DAG的答案数列的EGF,这就等价于n个点的DAG个数的EGF。更具体地:
A ( x ) k k ! \frac {A(x)^k}{k!} k!A(x)k
就是把n个点划分为k个弱连通DAG的答案数列的EGF。之所以要除以k!,是因为EGF求的是k个元素的排列个数,但是它们应该是无序的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值