状压图计数
cross(S,T)=∑u∈S,v∈T[(u→v)∈E].
DAG 子图计数
找出子结构。
我们可以把 DAG 的第一层拆出来,也就是入度为
0 的点。
设只考虑
S 内的点的方案数为
fS,子集容斥,考虑入度为
0 的点的集合恰好为
T。
fS=\emp=T⊆R⊆S∑(−1)∣R∣−∣T∣2\w(R,S\smR)fS\smR=\emp=R⊆S∑(−1)∣R∣2\w(R,S\smR)fS\smR\emp=T⊆R∑(−1)∣T∣=\emp=R⊆S∑(−1)∣R∣+12\w(R,S\smR)fS\smR
强连通子图计数
别名主旋律。
强连通子图数=总子图数−非强连通子图数。
设
fS 为点集
S 的答案,
gS 为把点集
S 缩点后为若干个单点的方案数,仍然是枚举 DAG 中入度为
0 的点集,套用上面的结果,则有:
fS=2\w(S,S)−\emp=T⊆S∑(−1)T缩点后点数+1gT2\w(T,S\smT)+\w(S\smT,S\smT)
注意这里分出来第一层之后后面怎么样已经不用管了,还必须去掉
T=S,T缩点后点数=1 的情况。
把容斥系数写到
g 里面,即一个块为
1,每分一个乘上
−1 的系数。
gSfS=fS−T⊂S,x∈T∑fTgS\smT=2\w(S,S)−\emp=T⊆S∑gT2\w(T,S\smT)+\w(S\smT,S\smT)
注意减去的是非连通子图,当
T=S 时,
gS 不能包含只分成一块的方案,正好解决了转移顺序的问题。
岁月
主要讲 C 性质,剩下的在 ex 里面。
题面就不写了,下面仍然是按照概率来计算。
考虑能到达所有点的点集恰好为
P,全集为
U,需要满足:
- P 强连通:主旋律。
- U−P 没有连向 P 的边:直接计算。
- P 能到达 U−P:
设 fS(S⊇P) 为 P 能到达 S 内的点的概率,fP=1。
fS=1−T⊂S,P⊆T∑fT2−\w(T,S\smT)
三部分独立,可以直接乘起来。
考虑
fU 从哪里贡献过来:选定一个
S⊇P,考虑它上面的
1,经过一条
S→U 的路径,乘上系数
2−\w(T,S\smT),贡献到
fU。
所以可以倒过来转移,再做超集和。
ex
最小生成树的结论,转成对于每种权值,都在把一些连通块合并起来。终点在连通块的根集中的边才有用。
所以
cross′(S,T)=\w({u∣∃v∈S,u,v在同一连通块中},T)还是分成三部分:
- 强连通:只需要强制分出来的 T 必须是完整的,即一个连通块不能同时在 T 和 S\smT 中。
- 没有反边:还是直接算。
- 可达所有点:在这里把每个连通块中的概率算上,同时也要强制 T 完整。
具体可以看代码,需要注意把 dp 倒过来转移时的初始值(即可能的终点)。
重塑时光
会上面的东西之后就很简单了,建议降紫。
\xdef\noe#1#2{[\w(#1,#2)=0]}
首先去掉概率,总共的方案数为
(n+k)!。由于判定的条件只和这些选出来的
非空集合有关,考虑最后有
s 个非空集合,则有方案数
n!(n+1)k1×k!×s!×(sk+1),四个项的意义都比较清晰。
剩下的就是在一个 dag 上面划分
s 个集合,满足:每个集合之内都要是拓扑序排列;集合之间的边还是一个 dag。
直接套用主旋律的容斥。
设
fi,S 表示分了
i 个集合,分走了
S 内的点的方案数,
gi,S 类似,
hS 处理集合内的拓扑序问题(计算直接枚举第一个点)。
fi,Sgi,ShS=j+k=i∑\emp=T⊆S∑gj,Tfk,S\smT\noeTS\smT=x∈T⊆S∑−hTgi−1,S\smT\noeTS\smT\noeS\smTT=x∈S∑hS\sm{x}\noeS\sm{x}{x}
O(3nn2)。要少一个
n 就要在计算
f 和
g 的时候拉插。
最小边双/点双/强连通生成子图
耳分解。以后再补。
由于无向图的对称性,很多东西在无向图上都可以运用集合幂级数技术从 3n 优化到 2npoly(n)。
边双/点双计数
Message Spread
集合幂级数
https://www.luogu.com.cn/article/46x8prtw
反演本身是一种容斥,通常把所求的东西的自由度扩大,但是却能将“恰好”、“一一对应”的这一类奇怪的限制给去掉,从而使得在计数角度方面的限制与状态缩小、化简。
容斥原理
有一些元素和
n 个限制,满足第
i 个限制的元素集合为
Si,则:
满足所有限制的集合大小:
i=1⋂nSi=m=1∑n(−1)m+1T⊆[n],∣T∣=m∑x∈T⋃Sx
满足任意一个限制的集合大小:
i=1⋃nSi=m=1∑n(−1)m+1T⊆[n],∣T∣=m∑x∈T⋂Sx
子集/超集反演
设
f(S) 为最终状态为
S 的答案,
g(S) 为最终状态为
S 的
子集时的答案,即有:
g(S)=T⊆S∑f(T)
则我们有:
f(S)=T⊆S∑(−1)∣S∣−∣T∣g(T)
设
f(S) 为最终状态为
S 的答案,
g(S) 为最终状态为
S 的
超集时的答案,即有:
g(S)=T⊇S∑f(T)
则我们有:
f(S)=T⊇S∑(−1)∣S∣−∣T∣g(T)
证明都是简单的。
二项式反演
也就是只关心集合的大小,所以一样有所谓的子集和超集,常用的是超集。
超集:
设
f(x) 为
恰好满足
x 个限制的答案,
g(x) 为
钦定(至少) 满足
x 个限制的答案。
g(x)=x≤i∑(xi)f(i)
一个方案会贡献
(x∣S∣) 次。
则我们有:
f(x)=x≤i∑(−1)x−i(xi)g(i)
子集:
略去。
形式非常简单,什么时候添加
(−1)x−i 只用看大小就好,上面的子集反演也一样。
是不是应该从 fwt 说起?
NOI2025 集合
因为
P∩Q=\emp,有
val(P∪Q)=val(P)val(Q)。
定义
N={0,1,…,n−1},
U={0,1,…,2n−1}。区分什么时候是全集。
Ans=P⊆U∑Q⊆U∑[f(P)=f(Q)][P∩Q=\emp]val(P)val(Q)=S⊆N∑P⊆U∑[f(P)=S]Q⊆U∑[f(Q)=S][P∪Q=\emp]val(P)val(Q)
f 相当于钦定一些二进制位必须全选,剩下的至少要不选一个,这不好处理。考虑把至少不选一个容斥掉,也就是超集反演。
这里反演的时候要对
P 和
Q 分开反演两次(可以理解为先对
P 反演,再对
Q 反演,
Q 的时候全集会变),而不是一起做,不然
g 没有实际意义,还是不好做。
Ans=S⊆N∑P⊆U∑[f(P)=S]Q⊆U∑[f(Q)=S][P∪Q=\emp]val(P)val(Q)=S⊆N∑TP⊇S∑(−1)∣S∣−∣TP∣TQ⊇S∑(−1)∣S∣−∣TQ∣P⊆U∑[f(P)⊇TP]Q⊆U∑[f(Q)⊇TQ][P∪Q=\emp]val(P)val(Q)=TP⊆N,TQ⊆N∑(−1)∣TP∣+∣TQ∣2∣TP∩TQ∣P⊆U∑Q⊆U∑[f(P)⊇TP][f(Q)⊇TQ][P∪Q=\emp]val(P)val(Q)
- 若 x⊇TP∪TQ:在 U,V 中都可以选;
- 否则,若 x⊇TP:只在 U 中可选;
- 否则,若 x⊇TQ:只在 V 中可选;
- 否则不可选。
先算中间两种情况,再把第一种情况除掉。
Ans=TP⊆N,TQ⊆N∑(−1)∣TP∣+∣TQ∣2∣TP∩TQ∣P⊆U∑Q⊆U∑[f(P)⊇TP][f(Q)⊇TQ][P∪Q=\emp]val(P)val(Q)=TP⊆N,TQ⊆N∑(−1)∣TP∣+∣TQ∣2∣TP∩TQ∣(x⊇TP∏(ax+1))x⊇TQ∏(ax+1)x⊇TP∪TQ∏(ax+1)22ax+1
又有交集又有并集,考虑去掉一个。
Ans=TP⊆N,TQ⊆N∑(−2)∣TP∣(−2)∣TQ∣2−∣TP∪TQ∣(x⊇TP∏(ax+1))x⊇TQ∏(ax+1)x⊇TP∪TQ∏(ax+1)22ax+1=T⊆N∑2−∣T∣(x⊇T∏(ax+1)22ax+1)TP,TQ∑[TP∪TQ=T]((−2)∣TP∣(x⊇TP∏(ax+1)))(−2)∣TQ∣x⊇TQ∏(ax+1)
明显是一个 or 卷积,那么这题就做完了,怎么样很简单吧。
注意有一个除
0 的问题,那由于最后
0 的次数必定不小于
0,在加法的时候只保留最低次的即可。