学了一天的有标号无向图计数真的自闭了…
本篇文章是基于2019WC汪乐平大佬的讲课课件《生成函数,多项式算法与图的计数》编写的。
注意:文中所有生成函数都规定为指数型生成函数(EGF),请注意这一点。
0 前置知识
1 理论推导
1.1 有标号无向连通图计数
求 n n n 个点的简单 (无重边无自环) 有标号无向连通图数目,答案对 1004535809 1004535809 1004535809 取模。
记
i
i
i个点无向连通图数生成函数为
F
(
x
)
F(x)
F(x),
i
i
i个点无向图数生成函数为
G
(
x
)
G(x)
G(x)。
我们枚举无向图的连通块个数
i
i
i得到:
G
(
x
)
=
∑
i
=
0
∞
F
i
(
x
)
i
!
=
e
F
(
x
)
G(x)=\sum^{∞}_{i=0}\frac{F^i(x)}{i!}=e^{F(x)}
G(x)=i=0∑∞i!Fi(x)=eF(x)
那么
F
(
x
)
=
ln
G
(
x
)
F(x)=\ln G(x)
F(x)=lnG(x)。
多项式求
ln
\ln
ln即可。
这题还有多项式求逆的方法…但是其实你仔细想一想这种做法就是多推了多项式求
ln
\ln
ln的模板部分而已…
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
1.2 点双连通图计数
求 n n n 个点的有标号点双连通图(简单无向图,整个图是一个点双连通分量)的个数,答案对 998244353 998244353 998244353 取模。
点双连通图:如果一个无向连通图删去任意一个点都仍然是连通的,我们就称其为点双连通图。
首先我们需要明确一点:对于一个无向简单连通图,任意一个点必定在至少一个点双连通分量里面,一个点双连通分量的大小至少大于等于
2
2
2。
所以我们首先需要特判
n
=
1
n=1
n=1的情况。
我们先用上一道题的做法求出
i
i
i个点无向连通图数生成函数
F
(
x
)
F(x)
F(x)。
然后设
i
i
i个点有根无向连通图数
d
i
d_i
di的生成函数为
D
(
x
)
D(x)
D(x),
i
i
i个点无根点双连通图数
b
i
b_i
bi的生成函数为
B
(
x
)
B(x)
B(x)。
显然可以得到
[
x
n
]
D
(
x
)
=
n
[
x
n
]
F
(
x
)
[x^n]D(x)=n[x^n]F(x)
[xn]D(x)=n[xn]F(x)。
考虑如何得到
B
(
x
)
B(x)
B(x)和
F
(
x
)
F(x)
F(x)之间的关系,我们可以利用我们一开始知道的性质,那么对于一个有根无向连通图其选中的根必定在至少一个点双连通分量里面,而且根据定义这些点双连通分量两两的交集有且只有根。
例如下面这个奇怪的有根无向连通图,包含它的根
R
R
R的点双连通分量的点集可以表示为
{
3
,
R
}
,
{
4
,
5
,
6
,
7
,
8
,
R
}
,
{
9
,
10
,
11
,
12
,
R
}
\{3,R\},\{4,5,6,7,8,R\},\{9,10,11,12,R\}
{3,R},{4,5,6,7,8,R},{9,10,11,12,R}。
如何计数?现在我们考虑先将
R
R
R这个点与其相邻的边删去。
显然现在的连通块个数为先前包含根的点双连通分量的个数,我们对于每一个连通块单独计数,由于这些连通块理论上没有任何块数限制且相互独立,因此把它们
e
x
p
exp
exp起来即可。
观察
{
3
,
R
}
\{3,R\}
{3,R}这一组点双连通分量我们可以发现,对于每一个在点双连通分量上的点(除去
R
R
R)我们其实都可以在上面插上一个以其为根的无向连通图,并且容易发现这样做并不会影响到包含这个根
R
R
R的任何点双连通分量的大小。
那么很容易得到一个连通块的方案数的生成函数:
∑
i
=
1
∞
b
i
+
1
D
i
(
x
)
i
!
\sum^{∞}_{i=1}b_{i+1}\frac{D^i(x)}{i!}
i=1∑∞bi+1i!Di(x)
注意到
∑
i
=
1
∞
b
i
+
1
i
!
x
i
\sum^{∞}_{i=1}\frac{b_{i+1}}{i!}x^i
∑i=1∞i!bi+1xi就为
B
′
(
x
)
B'(x)
B′(x),因此原式等于
B
′
(
D
(
x
)
)
B'(D(x))
B′(D(x))。
那么整个图的生成函数为
D
(
x
)
=
x
e
B
′
(
D
(
x
)
)
D(x)=xe^{B'(D(x))}
D(x)=xeB′(D(x))(注意加上根)。
现在我们成功的找到了
D
(
x
)
D(x)
D(x)与
B
(
x
)
B(x)
B(x)的关系,然而这个式子并不能牛顿迭代,考虑用复合逆解决:
B
′
(
D
(
x
)
)
=
ln
D
(
x
)
x
B'(D(x))=\ln \frac{D(x)}{x}
B′(D(x))=lnxD(x)
令
H
(
x
)
=
ln
D
(
x
)
x
H(x)=\ln \frac{D(x)}{x}
H(x)=lnxD(x),套扩展拉格朗日反演公式可以得到:
[
x
n
]
B
′
(
x
)
=
1
n
[
x
n
−
1
]
H
′
(
x
)
(
x
D
(
x
)
)
n
[x^n]B'(x)=\frac{1}{n}[x^{n-1}]H'(x)(\frac{x}{D(x)})^n
[xn]B′(x)=n1[xn−1]H′(x)(D(x)x)n
由定义得
e
−
H
(
x
)
=
x
D
(
x
)
e^{-H(x)}=\frac{x}{D(x)}
e−H(x)=D(x)x,因此:
[
x
n
]
B
′
(
x
)
=
1
n
[
x
n
−
1
]
H
′
(
x
)
e
−
n
H
(
x
)
[x^n]B'(x)=\frac{1}{n}[x^{n-1}]H'(x)e^{-nH(x)}
[xn]B′(x)=n1[xn−1]H′(x)e−nH(x)
注意我们求到的是
B
′
(
x
)
B'(x)
B′(x)的系数,因此强烈建议一开始就将
n
n
n减一然后做一遍(上面的推导也是减了一的),最后再乘以一个
(
n
−
1
)
!
(n-1)!
(n−1)!(这里的
n
n
n是减了之后的,由于
B
(
x
)
B(x)
B(x)是EGF我们首先乘
(
n
+
1
)
!
(n+1)!
(n+1)!,因为求导除以
(
n
+
1
)
(n+1)
(n+1),由于上面反演有一个系数再除一次
n
n
n)。
理论复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)(常数巨大)。
1.3 边双连通图计数
求 n n n 个点的有标号边双连通图(简单无向图,整个图是一个边双连通分量)的个数,答案对 998244353 998244353 998244353 取模。
边双连通图:如果一个无向连通图删去任意一条边都仍然是连通的,我们就称其为边双连通图。
知道点双连通计数怎么做之后边双就很简单了。
首先我们需要知道:对于一个无向简单连通图,任意一个点必定在有且只有一个边双连通分量里面,一个边双连通分量的大小大于等于
1
1
1。
同样用上道题的方法得到
i
i
i个点有根无向连通图数
d
i
d_i
di的生成函数为
D
(
x
)
D(x)
D(x)。
定义
i
i
i个点有根(没错,是有根)点双连通图数
b
i
b_i
bi的生成函数为
B
(
x
)
B(x)
B(x)。
同样先找
B
(
x
)
B(x)
B(x)与
D
(
x
)
D(x)
D(x)之间的关系,同样对于一个无向连通图的根
R
R
R,根据性质我们这只能够找到有且一个包含该点的边双连通分量。
还是那张奇怪的图,显然包含
R
R
R的边双连通分量的点集为
{
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
R
}
\{4,5,6,7,8,9,10,11,12,R\}
{4,5,6,7,8,9,10,11,12,R}。
由于只有一个边双连通分量,我们无需删掉
R
R
R。我们可以直接考虑在这个边双连通分量的点上插入连同块。
但是问题来了,如果我们仍然像上一道题目那样直接在上面插上一个以其为根的无向连通图,那么下面这个图也会被计入连通边双连通分量的点集为
{
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
R
}
\{4,5,6,7,8,9,10,11,12,R\}
{4,5,6,7,8,9,10,11,12,R}的情况:
事实上我们知道整个图才是一个边双连通分量,因此这样会算重。
如何解决?其实我们只需要让连通块的根连到这个边双连通分量的任意一点即可(即规定根不在边双连通分量上而是隔了一条边)。
接下来枚举这个边双连通分量大小为
i
i
i
那么一个连通块连到这个边双连通分量的任意一点的方案数
i
D
(
x
)
iD(x)
iD(x)。
由于我们可以选任意多个互不干扰的连通块接上这个边双连通分量,因此整个在边双连通分量上接连通块的方案数的生成函数为
e
i
D
(
x
)
e^{iD(x)}
eiD(x)。
接下来很容易得到:
D
(
x
)
=
∑
i
=
1
∞
b
i
e
i
D
(
x
)
x
i
i
!
=
∑
i
=
1
∞
b
i
(
x
e
D
(
x
)
)
i
i
!
=
B
(
x
e
D
(
x
)
)
D(x)=\sum^{∞}_{i=1}b_ie^{iD(x)}\frac{x^i}{i!}=\sum^{∞}_{i=1}b_i\frac{(xe^{D(x)})^i}{i!}=B(xe^{D(x)})
D(x)=i=1∑∞bieiD(x)i!xi=i=1∑∞bii!(xeD(x))i=B(xeD(x))
接下来我们同样用复合逆解决:
令
H
(
x
)
=
x
e
D
(
x
)
H(x)=xe^{D(x)}
H(x)=xeD(x),得到
B
(
H
(
x
)
)
=
D
(
x
)
B(H(x))=D(x)
B(H(x))=D(x)
[
x
n
]
B
(
x
)
=
1
n
[
x
n
−
1
]
D
′
(
x
)
(
x
H
(
x
)
)
n
[x^n]B(x)=\frac{1}{n}[x^{n-1}]D'(x)(\frac{x}{H(x)})^n
[xn]B(x)=n1[xn−1]D′(x)(H(x)x)n
[
x
n
]
B
(
x
)
=
1
n
[
x
n
−
1
]
D
′
(
x
)
e
−
n
D
(
x
)
[x^n]B(x)=\frac{1}{n}[x^{n-1}]D'(x)e^{-nD(x)}
[xn]B(x)=n1[xn−1]D′(x)e−nD(x)
没有什么细节,直接用多项式全家桶爆算即可。
理论复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)(常数巨大)。
1.4 有标号仙人掌计数
求 n n n 个点的有标号仙人掌的个数,答案对 998244353 998244353 998244353 取模。
还是同样的套路,我们定义
i
i
i个点有根仙人掌的个数
f
i
f_i
fi的生成函数为
F
(
x
)
F(x)
F(x)。
然后来一个改的更奇怪的例子:
现在的根在两个环
{
9
,
10
,
11
,
12
,
R
}
\{9,10,11,12,R\}
{9,10,11,12,R}和
{
4
,
5
,
6
,
7
,
8
,
R
}
\{4,5,6,7,8,R\}
{4,5,6,7,8,R}上。根据仙人掌的定义,与
R
R
R有交的所有环的两两之间的交点只有
R
R
R。
所以类似点双连通图计数我们断开
R
R
R与关于
R
R
R的所有边:
对于原来是环的连通块,我们设其环大小为
i
+
1
(
i
≥
2
)
i+1(i≥2)
i+1(i≥2)。由于每个点都能够以环上的点为根插入一个有根仙人掌,然而当前连通块(一条链)首尾交换是同一种方案,因此生成函数是
D
i
(
x
)
2
\frac{D^i(x)}{2}
2Di(x)。
[看完这里你可能会有很大的疑惑,因为我们前面做点双连通图计数时同样做了这个操作,但是除的是
i
!
i!
i!。原因是我们在做点双连通图计数时提前为整个连通块编好了号,插入的多项式只有一个顺序,而这里是通过
D
i
(
x
)
D^i(x)
Di(x)内部顺序来编好的,因此需要考虑潜在的同构问题。]
对于原来不是环的连通块,生成函数显然是
D
(
x
)
D(x)
D(x)。
不同的连通块无限制互相无影响组合,用
exp
\exp
exp组合起来,因此得到:
F
(
x
)
=
x
e
F
(
x
)
+
1
2
∑
i
=
2
∞
F
i
(
x
)
=
x
e
2
F
(
x
)
−
F
2
(
x
)
2
−
2
F
(
x
)
F(x)=xe^{F(x)+\frac{1}{2}\sum^{∞}_{i=2}F^i(x)}=xe^{\frac{2F(x)-F^2(x)}{2-2F(x)}}
F(x)=xeF(x)+21∑i=2∞Fi(x)=xe2−2F(x)2F(x)−F2(x)
接下来都是套路了:这里只有
F
(
x
)
F(x)
F(x),显然可以牛顿迭代。
我们递归求解。
设
F
0
(
x
)
F_0(x)
F0(x)表示当前已知的
F
(
x
)
F(x)
F(x)的前面的一半。
令
G
(
F
(
x
)
)
=
x
e
2
F
(
x
)
−
F
2
(
x
)
2
−
2
F
(
x
)
−
F
(
x
)
G(F(x))=xe^{\frac{2F(x)-F^2(x)}{2-2F(x)}}-F(x)
G(F(x))=xe2−2F(x)2F(x)−F2(x)−F(x)
现在已知
G
(
F
0
(
x
)
)
≡
0
(
m
o
d
⌈
n
2
⌉
)
G(F_0(x))≡0(\bmod \lceil \frac{n}{2}\rceil)
G(F0(x))≡0(mod⌈2n⌉)。
求导:
G
′
(
F
0
(
x
)
)
≡
(
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
)
′
x
e
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
−
1
(
m
o
d
⌈
n
2
⌉
)
G'(F_0(x))≡\Bigg (\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}\Bigg )'xe^{\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}}-1(\bmod \lceil \frac{n}{2}\rceil)
G′(F0(x))≡(2−2F0(x)2F0(x)−F02(x))′xe2−2F0(x)2F0(x)−F02(x)−1(mod⌈2n⌉)
G
′
(
F
0
(
x
)
)
≡
F
0
2
(
x
)
−
2
F
0
(
x
)
+
2
2
(
F
0
(
x
)
−
1
)
2
x
e
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
−
1
(
m
o
d
⌈
n
2
⌉
)
G'(F_0(x))≡\frac{F_0^2(x)-2F_0(x)+2}{2(F_0(x)-1)^2}xe^{\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}}-1(\bmod \lceil \frac{n}{2}\rceil)
G′(F0(x))≡2(F0(x)−1)2F02(x)−2F0(x)+2xe2−2F0(x)2F0(x)−F02(x)−1(mod⌈2n⌉)
G
′
(
F
0
(
x
)
)
≡
(
1
2
+
1
2
(
F
0
(
x
)
−
1
)
2
)
x
e
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
−
1
(
m
o
d
⌈
n
2
⌉
)
G'(F_0(x))≡\Bigg (\frac{1}{2}+\frac{1}{2(F_0(x)-1)^2}\Bigg ) xe^{\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}}-1(\bmod \lceil \frac{n}{2}\rceil)
G′(F0(x))≡(21+2(F0(x)−1)21)xe2−2F0(x)2F0(x)−F02(x)−1(mod⌈2n⌉)
然后套公式:
F
(
x
)
≡
F
0
(
x
)
−
2
x
e
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
−
2
F
0
(
x
)
(
1
+
1
(
F
0
(
x
)
−
1
)
2
)
x
e
2
F
0
(
x
)
−
F
0
2
(
x
)
2
−
2
F
0
(
x
)
−
2
(
m
o
d
n
)
F(x)≡F_0(x)-\frac{2xe^{\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}}-2F_0(x)}{\Bigg (1+\frac{1}{(F_0(x)-1)^2}\Bigg ) xe^{\frac{2F_0(x)-F_0^2(x)}{2-2F_0(x)}}-2}(\bmod \ n)
F(x)≡F0(x)−(1+(F0(x)−1)21)xe2−2F0(x)2F0(x)−F02(x)−22xe2−2F0(x)2F0(x)−F02(x)−2F0(x)(mod n)
每次递归的时候算这么大一坨式子就可…以…了…
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)(实测常数有两个
log
\log
log)
1.5 有标号荒漠计数
荒漠是一张无向图,一个荒漠的每个极大连通分量都是一个仙人掌。
求 n n n 个点的有标号荒漠的个数,答案对 998244353 998244353 998244353 取模。
把上道题最终的
i
i
i个点无根仙人掌数生成函数做一个
exp
\exp
exp即可。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)(只要你相信就好)
1.6 有标号DAG计数
对 n n n 个点有标号的有向无环图进行计数。
要求:弱连通图(所有的有向边替换为无向边后的图为连通图)。
答案对 998244353 998244353 998244353 取模的结果。
推荐巨佬博客
首先我们先不考虑弱连通图这个要求,考虑如何计数。
模仿在DAG上拓补BFS的思路,我们可以把DAG分成若干层(类似BFS的每一层)。
显然对于每一层的点显然互相之间不能够连边。
考虑这一层和更深的层一共有
i
i
i个点组成的DAG方案数为
f
i
f_i
fi,我们枚举当前层有
j
j
j个点,考虑它和更深的层的
i
−
j
i-j
i−j个点的连边。但是你会发现这样做相当困难,因为我们同时还需要保证这
i
−
j
i-j
i−j个点不属于当前层,即当前入度不为
0
0
0。
显然可以考虑容斥,计算当前层至少有
j
j
j个点的方案数,那么这样我们
j
j
j个点与
i
−
j
i-j
i−j之间的边可以随便连,即为
2
j
(
i
−
j
)
2^{j(i-j)}
2j(i−j),套二项式反演的公式可以得到:
f
i
=
∑
j
=
1
n
−
1
(
−
1
)
j
−
1
(
i
j
)
2
j
(
i
−
j
)
f
i
−
j
f_i=\sum^{n-1}_{j=1}(-1)^{j-1}\binom{i}{j}2^{j(i-j)}f_{i-j}
fi=j=1∑n−1(−1)j−1(ji)2j(i−j)fi−j
现在我们试着用多项式优化一下。
瓶颈在于
2
j
(
i
−
j
)
2^{j(i-j)}
2j(i−j)的拆分。
考虑
j
(
i
−
j
)
=
i
2
2
−
j
2
2
−
(
i
−
j
)
2
2
j(i-j)=\frac{i^2}{2}-\frac{j^2}{2}-\frac{(i-j)^2}{2}
j(i−j)=2i2−2j2−2(i−j)2
这样就可以直接做了,然而这样做会出现
2
\sqrt{2}
2,处理起来比较麻烦,考虑继续化简:
i
2
2
−
j
2
2
−
(
i
−
j
)
2
2
=
i
(
i
−
1
)
2
−
j
(
j
−
1
)
2
−
(
i
−
j
)
(
i
−
j
−
1
)
2
+
i
2
−
j
2
−
i
−
j
2
=
(
i
2
)
−
(
j
2
)
−
(
i
−
j
2
)
\frac{i^2}{2}-\frac{j^2}{2}-\frac{(i-j)^2}{2}=\frac{i(i-1)}{2}-\frac{j(j-1)}{2}-\frac{(i-j)(i-j-1)}{2}+\frac{i}{2}-\frac{j}{2}-\frac{i-j}{2}=\binom{i}{2}-\binom{j}{2}-\binom{i-j}{2}
2i2−2j2−2(i−j)2=2i(i−1)−2j(j−1)−2(i−j)(i−j−1)+2i−2j−2i−j=(2i)−(2j)−(2i−j)。
现在我们就可以将原式拆成两个多项式:
F
(
x
)
=
∑
i
=
0
∞
f
i
i
!
⋅
2
(
i
2
)
x
i
F(x)=\sum^{∞}_{i=0}\frac{f_i}{i!·2^{\binom{i}{2}}}x^i
F(x)=i=0∑∞i!⋅2(2i)fixi
G
(
x
)
=
∑
i
=
0
∞
(
−
1
)
i
+
1
i
!
⋅
2
(
i
2
)
x
i
G(x)=\sum^{∞}_{i=0}\frac{(-1)^{i+1}}{i!·2^{\binom{i}{2}}}x^i
G(x)=i=0∑∞i!⋅2(2i)(−1)i+1xi
得到等式
F
(
x
)
=
F
(
x
)
G
(
x
)
+
1
F(x)=F(x)G(x)+1
F(x)=F(x)G(x)+1(加一是因为前面乘法没有常数项)
得到:
F
(
x
)
=
1
1
−
G
(
x
)
F(x)=\frac{1}{1-G(x)}
F(x)=1−G(x)1。
多项式求逆即可。
这样我们就解决了不考虑弱连通的有标号DAG计数问题。
根据前面学习过的内容,由于不要求连通的DAG生成函数是弱连通的DAG的若干个的自由组合,可以
e
x
p
exp
exp,因此设
i
i
i个点弱连通DAG图数生成函数为
H
(
x
)
H(x)
H(x),
i
i
i个点不要求连通DAG图数生成函数为
F
′
(
x
)
F'(x)
F′(x)(注意与
F
(
x
)
F(x)
F(x)的区别)。
因此
H
(
x
)
=
ln
F
′
(
x
)
H(x)=\ln F'(x)
H(x)=lnF′(x)。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
2 例题
2.1 BZOJ 3684 大朋友和多叉树
给一个含有 m m m个正整数的集合 D D D和一个正整数 s ( m < s , 1 ∉ D ) s(m<s,1\notin D) s(m<s,1∈/D)。
一棵树是合法的当且仅当每个非叶节点的孩子数量都在集合 D D D内。
询问有多少颗不同的含有 s s s个结点的树。
两颗树是相同的当且仅当结构相同(孩子之间有顺序)。
所有数字均不超过 1 0 5 10^5 105。
设符合题意的多叉树的方案数的生成函数为
F
(
x
)
F(x)
F(x)。
对于该多叉树中的任何一个子树,它要么是一个叶子,要么它由
i
(
i
∈
D
)
i(i\in D)
i(i∈D)个更小的子树组合而成,因此可以得到等量关系:
F
(
x
)
=
x
+
∑
i
∈
D
F
(
x
)
i
F(x)=x+\sum_{i\in D} F(x)^i
F(x)=x+i∈D∑F(x)i
移项:
F
(
x
)
−
∑
i
∈
D
F
(
x
)
i
=
x
F(x)-\sum_{i\in D} F(x)^i=x
F(x)−i∈D∑F(x)i=x
设
B
(
x
)
=
x
−
∑
i
∈
D
x
i
B(x)=x-\sum_{i\in D} x^i
B(x)=x−∑i∈Dxi,因此有:
B
(
F
(
x
)
)
=
x
B(F(x))=x
B(F(x))=x
这是一个标准的多项式复合逆的形式,因此拉格朗日反演:
[
x
n
]
F
(
x
)
=
1
n
[
x
n
−
1
]
(
x
B
(
x
)
)
n
[x^n]F(x)=\frac{1}{n}[x^{n-1}]\bigg (\frac{x}{B(x)}\bigg )^n
[xn]F(x)=n1[xn−1](B(x)x)n
在实现的时候为了方便计算应该写成:
[
x
n
]
F
(
x
)
=
1
n
[
x
n
−
1
]
(
B
(
x
)
x
)
−
n
[x^n]F(x)=\frac{1}{n}[x^{n-1}]\bigg (\frac{B(x)}{x}\bigg )^{-n}
[xn]F(x)=n1[xn−1](xB(x))−n
这样就只需要多项式快速幂而不需要求逆了。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
2.2 HDU 5279 YJC plays Minecraft
一张图由 n n n个部分组成,第 i ( 1 ≤ i ≤ n ) i(1\leq i\leq n) i(1≤i≤n)个部分是一个 a i a_i ai个点的完全图。
第 i ( 1 ≤ i ≤ n ) i(1\leq i\leq n) i(1≤i≤n)个部分的第 a i a_i ai个点和第 ( i m o d n ) + 1 (i\bmod n)+1 (imodn)+1个部分的第 1 1 1个点连一条边,求图的生成森林个数。
所有数字均不超过 1 0 5 10^5 105。
显然我们可以考虑容斥的思想来解决这个问题。
定义
i
i
i个点的完全图生成树个数
f
i
f_i
fi的生成函数为
F
(
x
)
F(x)
F(x),
i
i
i个点的完全图生成森林个数
g
i
g_i
gi的生成函数为
G
(
x
)
G(x)
G(x),
i
i
i个完全图生成森林中
1
1
1与
a
i
a_i
ai不连通的个数
h
i
h_i
hi的生成函数为
H
(
x
)
H(x)
H(x)。
那么我们可以先独立先让每个完全图生成一个合法的森林,不考虑它之间的连通性,再减去
n
n
n个部分连成一个环的方案数。即为:
2
n
∏
i
=
1
n
g
a
i
−
∏
i
=
1
n
(
g
a
i
−
h
a
i
)
2^n\prod^n_{i=1}g_{a_i}-\prod^n_{i=1}(g_{a_i}-h_{a_i})
2ni=1∏ngai−i=1∏n(gai−hai)
2
n
2^n
2n表示部分与部分之间的边是否保留,后面减去的即为
n
n
n条边全部保留且每个部分的
1
1
1和
n
n
n都连通的方案总数。
显然
F
(
x
)
=
x
+
∑
i
=
2
∞
i
i
−
2
x
i
F(x)=x+\sum^{∞}_{i=2}i^{i-2}x^i
F(x)=x+∑i=2∞ii−2xi。根据之前的知识,
G
(
x
)
=
e
F
(
x
)
G(x)=e^{F(x)}
G(x)=eF(x)。
关键是
H
(
x
)
H(x)
H(x)该怎么求:
枚举包含
1
1
1号点的连通块大小为
i
+
1
i+1
i+1,这个连通块有
(
n
−
2
i
)
⋅
f
i
+
1
\binom{n-2}{i}·f_{i+1}
(in−2)⋅fi+1种形态,其余的可以组成一个独立的生成森林,即为
g
n
−
i
−
1
g_{n-i-1}
gn−i−1。
h
i
=
∑
i
=
0
n
−
2
(
n
−
2
i
)
⋅
f
i
+
1
⋅
g
n
−
i
−
1
h_i=\sum^{n-2}_{i=0}\binom{n-2}{i}·f_{i+1}·g_{n-i-1}
hi=i=0∑n−2(in−2)⋅fi+1⋅gn−i−1
这样我们就可以直接NTT优化了,然而题解发现这个等式还可以表示为:
H
′
′
(
x
)
=
F
′
(
x
)
G
′
(
x
)
H''(x)=F'(x)G'(x)
H′′(x)=F′(x)G′(x)
因此:
H
(
x
)
=
∫
∫
F
′
(
x
)
G
′
(
x
)
H(x)=∫∫F'(x)G'(x)
H(x)=∫∫F′(x)G′(x)
这样做会稍微方便一点。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
2.3 LOJ 6363 「地底蔷薇」
给定集合 S S S,请你求出 n n n 个点的「所有极大点双连通分量的大小都在 S S S 内」的不同简单无向连通图的个数对 998244353 998244353 998244353 取模的结果。
n ≤ 1 0 5 , ∑ x ∈ S x ≤ 1 0 5 n\leq 10^5,\sum_{x\in S}x\leq 10^5 n≤105,∑x∈Sx≤105
本题对点双连通分量的大小有了限制,因此我们考虑先求出点双连通图数目的生成函数再通过变换得到答案。
注意到
∑
x
∈
S
x
≤
1
0
5
\sum_{x\in S}x\leq 10^5
∑x∈Sx≤105,因此我们可以直接用前面的方法一个一个单点求出大小在集合
S
S
S内的点双连通图数目的生成函数。设其为
D
(
x
)
=
∑
i
∈
S
b
i
i
!
x
i
D(x)=\sum_{i\in S}\frac{b_i}{i!}x^i
D(x)=∑i∈Si!bixi。
那么满足题意的生成函数
F
(
x
)
F(x)
F(x)就为:
F
(
x
)
=
x
e
D
′
(
F
(
x
)
)
F(x)=xe^{D'(F(x))}
F(x)=xeD′(F(x))。
这又是一个复合逆的形式,同样代扩展拉格朗日反演公式很容易得到:
[
x
n
]
F
(
x
)
=
1
n
[
x
n
−
1
]
e
n
C
′
(
x
)
[x^n]F(x)=\frac{1}{n}[x^{n-1}]e^{nC'(x)}
[xn]F(x)=n1[xn−1]enC′(x)
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
3 实现
代码丑常数极大,请慎重食用。
3.1 有标号无向连通图计数-实现
3.2 点双连通图计数-实现
3.3 边双连通图计数-实现
3.4 有标号仙人掌计数-实现
被卡常了,没有代码qwq…
3.5 有标号荒漠计数-实现
同上