Stargazer' blog

渴望驻足的时光转瞬即逝
希求解脱的日夜寸阴若岁

0%

生成函数中某些计数问题

一些生成函数的计数问题的做法

背包计数

1:1inaiiai

i=1n(j=0xij)ai=exp(i=1nailn(11xi))

至于ln(11xi)可以变成ln(1xi)然后泰勒展开
或者用f=ln(g)g=ff=j=1ijxij111xi

得到

exp(i=1naij=1xijj))

调和级数处理再exp
复杂度O(nlogn)

2:1inaiiai1

类似的生成函数为

i=1n(1+xi)ai

后面的没区别

3:
niiiai

类似生成函数为

i=1n(1x(ai+1)i1xi)=exp(i=1nln(1x(ai+1)i)i=1nln(1xi))

两部分也没区别

树的计数

1:

ans=nn2

2:

ans=nn1

3:

fiiF(x)=ifixi
考虑由于无标号有根
那么对于子树每种大小相同形态无法区分
所以考虑所有大小为k的数构成的森林为
(ixik)fk
于是

F(x)=xi=1(11xk)fk

同时取对后求导

ln(F(x))=lnx+i=1fkln(11xk)FF=1x+k=1fkki=1xik1xF=F+Fk=1fkki=1xik

考虑对于[xn]

fnn=fn+j=1n1fik|njkfk(n1)fn=i=1n1fij|nijfj

分治NTT并枚举倍数更新ifi
复杂度O(nlog2n)

另外有一种O(nlogn)的推法

ξ(f(x))=i(11xi)fi=exp(i=1fij=1xijj)=exp(j=1f(xj)j)

即上面最开始那玩意
那么就是f(x)=xξ(f(x))
考虑用牛顿迭代求
已知h(f0)=f0xξ(f0)=0modxn
h(f)=0modx2n
那么就是f=f0h(f0)f(f0)
考虑对于ξ(f0),g=j=2f(xj)j
由于是modxnmodx2ng(x)
那么ξ(f0)=exp(f0+g),ξ(f0)=exp(f0+g)

那么就是f=f0f0xξ(f0)1xξ(f0)
复杂度就是O(nlogn)

3:

考虑设gn为答案
考虑容斥,对于一棵树看做用重心为根
减去所有其他的
gn=fni=1n2fifni
但对于n为偶数的情况树可能有两个重心
这时候贡献是(fn22)而不是fn22
这个直接一次卷积即可

前面求f可以分治NTT做到O(nlog2n)
如果是用牛顿迭代就是O(nlogn)

例题:SPOJPT07D O(n2)
洛谷-无标号无根树计数 O(nlog2n&nlogn)

有标号DAG计数

1:n()

fii个点的个数
枚举出度为0的点的个数
此时度数为0和其他点可以任意连边
但由于剩下的点也有出度为0的情况
容斥即可
那么

fi=j=1i(1)j1(ij)2j(ij)fij

复杂度O(n2)
考虑用NTT优化上述DP

由于2j(ij)不好弄
j(ij)=i22j22(ij)22
那么

2j(ij)=2i22j22(ij)2

变形后原DP式变为

fi2i2i!=j=1i(1)j1j!2j2fij2(ij)2(ij)!

写成生成函数就是
f=fg+1,则f=11g
注意递推式j是从1开始所以g没有0次项
多项式求逆即可

998244353下2的二次剩余有11619517,882049182;两个

2n()

考虑图必须弱联通
可以先求出f,然后容斥出g表示弱联通的答案
考虑枚举不连通时一号点所在连通块的大小减去
gi=fij=1i1(i1j1)fijgj
复杂度O(n2)

考虑移项后有

gi(i1)!+j=1i1fij(ij)!gj(j1)!=fi(i1)!

F(x)=i=1fii!xi,G(x)=i=1fi(i1)!xi,P(x)=i=1gi(i1)!xi
那么就是P+FP=G
P=G1+F
多项式求逆即可
复杂度O(nlogn)

仙人掌计数

这个是有标号的

考虑先算有根的情况
考虑一个点可能在某些环里,也有可能与子仙人掌相连
把环上这个点删去后会有很多子仙人掌
于是考虑exp
对于环正反顺序是相同的
所以得到f(x)=xexp(f(x)+i2fi(x)2)
考虑牛顿迭代

h(x)=fxexp(f+2ff222f)

已知h(f0)0modxn
h(f)0modx2n
那么

f=f0h(f0)h(f0)

对于h(f(x))=xf(x)这样的函数对f求导时将x看做常量

h(f0)=1(2f0f0222f0)xexp(2f0f0222f0)=1f022f0+22(f01)2xexp(2f0f0222f0)
于是

f=f02f02xexp(2f0f0222f0)2(1+1(f01)2)xexp(2f0f0222f0)

复杂度O(nlogn)

LOJ-仙人掌计数


无向连通图计数

考虑任意图是由无向连通图exp得到
而任意图的个数为2n(n1)/2
直接求ln即可

点双连通图计数

有标号
传送门

先求出i个点有根图个数
设其EGFF(x)
bi表示i+1个点的点双个数,设EGFB(x)
考虑对于一个无向有根连通图
根可能在多个点双内
删去根后会形成多个连通块
考虑将根以及所在的所有点双的边删去
则每个连通块都会变成若干个连通图
那么一个连通块的生成函数
枚举连通图个数就是kbkk!H(x)k
B(x)=ibii!xi
就有

F(x)=xe(B(F(x)))

那么

F(x)eB(F(x))=x

F1(x)F的复合逆
那么有

F1(x)=xeB(x)B(x)=ln(xF1(x))

G(x)=ln(F(x)x)

G(F1(x))=B(x)

由拓展拉格朗日反演得

[xn]B(x)=[xn]G(F1(x))=1n[xn1]G(x)(xF(x))=1n[xn1]G(x)(F(x)x)n

多项式exp求快速幂即可
复杂度O(nlogn)


边双连通图计数

有标号
传送门

仍然设f(x)表示有根图的EGF
bi表示i个点边双个数
考虑对于一个图
枚举根所在边双大小
删去后会剩下很多个无向联通子图
每个子图的根可以任意连向边双上任意一个点
那么就可以得到
f(x)=i1bixii!exp(if(x))
=i1bixii!exp(f)i=B(xexp(f))

g=xexp(f)
那么f=B(g)
取复合逆
f(g1)=B(x)
[xn]B(x)=[xn]f(g1)=1n[xn1]f(xg(x))n=1n[xn1]fexp(nf)
复杂度O(nlogn)