专栏文章

n\le 15

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mininwwg
此快照首次捕获于
2025/12/02 03:02
3 个月前
此快照最后确认于
2025/12/02 03:02
3 个月前
查看原文

状压图计数

cross(S,T)=uS,vT[(uv)E]\gdef\sm{\setminus}\gdef\w{cross}\gdef\emp{\varnothing}\w(S,T)=\sum_{u\in S,v\in T}[(u\to v)\in E].

DAG 子图计数

找出子结构。
我们可以把 DAG 的第一层拆出来,也就是入度为 00 的点。
设只考虑 SS 内的点的方案数为 fSf_S,子集容斥,考虑入度为 00 的点的集合恰好为 TT
fS=\empTRS(1)RT2\w(R,S\smR)fS\smR=\empRS(1)R2\w(R,S\smR)fS\smR\empTR(1)T=\empRS(1)R+12\w(R,S\smR)fS\smR\begin{aligned} f_S&=\sum_{\emp\ne T\sube R\sube S}(-1)^{|R|-|T|}2^{\w(R,S\sm R)}f_{S\sm R}\\ &=\sum_{\emp\ne R\sube S}(-1)^{|R|}2^{\w(R,S\sm R)}f_{S\sm R}\sum_{\emp\neq T\sube R}(-1)^{|T|}\\ &=\sum_{\emp\ne R\sube S}(-1)^{|R|+1}2^{\w(R,S\sm R)}f_{S\sm R} \end{aligned}

强连通子图计数

别名主旋律。
强连通子图数=总子图数非强连通子图数\text{强连通子图数}=\text{总子图数}-\text{非强连通子图数}
fSf_S 为点集 SS 的答案,gSg_S 为把点集 SS 缩点后为若干个单点的方案数,仍然是枚举 DAG 中入度为 00 的点集,套用上面的结果,则有:
fS=2\w(S,S)\empTS(1)T  缩点后点数+1gT2\w(T,S\smT)+\w(S\smT,S\smT)f_S=2^{\w(S,S)}-\sum_{\emp\ne T\sube S}(-1)^{\text{T\;缩点后点数}+1}\,g_T\,2^{\w(T,S\sm T)+\w(S\sm T,S\sm T)}
注意这里分出来第一层之后后面怎么样已经不用管了,还必须去掉 T=S,T  缩点后点数=1T=S,T\;缩点后点数=1 的情况。
把容斥系数写到 gg 里面,即一个块为 11,每分一个乘上 1-1 的系数。
找一个代表元,强制 TT 包含它。
gS=fSTS,xTfTgS\smTfS=2\w(S,S)\empTSgT2\w(T,S\smT)+\w(S\smT,S\smT)\begin{aligned} g_S&=f_S-\sum_{T\sub S,x\in T}f_T g_{S\sm T}\\ f_S&=2^{\w(S,S)}-\sum_{\emp\ne T\sube S}g_T\,2^{\w(T,S\sm T)+\w(S\sm T,S\sm T)} \end{aligned}
注意减去的是非连通子图,当 T=ST=S 时,gSg_S 不能包含只分成一块的方案,正好解决了转移顺序的问题。

岁月

主要讲 C 性质,剩下的在 ex 里面。
题面就不写了,下面仍然是按照概率来计算。
考虑能到达所有点的点集恰好为 PP,全集为 UU,需要满足:
  • PP 强连通:主旋律。
  • UPU-P 没有连向 PP 的边:直接计算。
  • PP 能到达 UPU-P: 设 fS(SP)f_S(S\supe P)PP 能到达 SS 内的点的概率,fP=1f_P=1 fS=1TS,PTfT2\w(T,S\smT)f_S=1-\sum_{T\sub S,P\sube T}f_T\,2^{-\w(T,S\sm T)}
三部分独立,可以直接乘起来。
考虑 fUf_U 从哪里贡献过来:选定一个 SPS\supe P,考虑它上面的 11,经过一条 SUS\to U 的路径,乘上系数 2\w(T,S\smT)2^{-\w(T,S\sm T)},贡献到 fUf_U
所以可以倒过来转移,再做超集和。
ex
最小生成树的结论,转成对于每种权值,都在把一些连通块合并起来。终点在连通块的根集中的边才有用。
所以 cross(S,T)=\w({uvS,u,v在同一连通块中},T)\gdef\ww{cross'}\ww(S,T)=\w(\{u\mid\exist v\in S,u,v\,\text{在同一连通块中}\},T)
还是分成三部分:
  • 强连通:只需要强制分出来的 TT 必须是完整的,即一个连通块不能同时在 TTS\smTS\sm T 中。
  • 没有反边:还是直接算。
  • 可达所有点:在这里把每个连通块中的概率算上,同时也要强制 TT 完整。
具体可以看代码,需要注意把 dp 倒过来转移时的初始值(即可能的终点)。

重塑时光

会上面的东西之后就很简单了,建议降紫。
\xdef\noe#1#2{[\w(#1,#2)=0]}
首先去掉概率,总共的方案数为 (n+k)!(n+k)!。由于判定的条件只和这些选出来的非空集合有关,考虑最后有 ss 个非空集合,则有方案数 1n!(n+1)k×k!×s!×(k+1s)\frac{1}{n!(n+1)^{\overline{k}}}\times k!\times s!\times\binom{k+1}{s},四个项的意义都比较清晰。
剩下的就是在一个 dag 上面划分 ss 个集合,满足:每个集合之内都要是拓扑序排列;集合之间的边还是一个 dag。
直接套用主旋律的容斥。
fi,Sf_{i,S} 表示分了 ii 个集合,分走了 SS 内的点的方案数,gi,Sg_{i,S} 类似,hSh_S 处理集合内的拓扑序问题(计算直接枚举第一个点)。
fi,S=j+k=i\empTSgj,Tfk,S\smT\noeTS\smTgi,S=xTShTgi1,S\smT\noeTS\smT\noeS\smTThS=xShS\sm{x}\noeS\sm{x}{x}\begin{aligned} f_{i,S}&=\sum_{j+k=i}\sum_{\emp\ne T\sube S}g_{j,T}f_{k,S\sm T}\noe{T}{S\sm T}\\ g_{i,S}&=\sum_{x\in T\sube S}{\color{red}-}h_Tg_{i-1,S\sm T}\noe{T}{S\sm T}\noe{S\sm T}{T}\\ h_S&=\sum_{x\in S}h_{S\sm \{x\}}\noe{S\sm\{x\}}{\{x\}} \end{aligned}
O(3nn2)O(3^nn^2)。要少一个 nn 就要在计算 ffgg 的时候拉插。

最小边双/点双/强连通生成子图

耳分解。以后再补。
由于无向图的对称性,很多东西在无向图上都可以运用集合幂级数技术从 3n3^n 优化到 2npoly(n)2^npoly(n)

边双/点双计数

Message Spread

集合幂级数

https://www.luogu.com.cn/article/46x8prtw
反演本身是一种容斥,通常把所求的东西的自由度扩大,但是却能将“恰好”、“一一对应”的这一类奇怪的限制给去掉,从而使得在计数角度方面的限制与状态缩小、化简。

容斥原理

有一些元素和 nn 个限制,满足第 ii 个限制的元素集合为 SiS_i,则:
满足所有限制的集合大小:
i=1nSi=m=1n(1)m+1T[n],T=mxTSx\left|\bigcap_{i=1}^{n}S_i\right|=\sum_{m=1}^n(-1)^{m+1}\sum_{T\sube[n],|T|=m}\left|\bigcup_{x\in T}S_x \right|
满足任意一个限制的集合大小:
i=1nSi=m=1n(1)m+1T[n],T=mxTSx\left|\bigcup_{i=1}^{n}S_i\right|=\sum_{m=1}^n(-1)^{m+1}\sum_{T\sube[n],|T|=m}\left|\bigcap_{x\in T}S_x \right|

子集/超集反演

f(S)f(S) 为最终状态为 SS 的答案,g(S)g(S) 为最终状态为 SS子集时的答案,即有:
g(S)=TSf(T)g(S)=\sum_{T\sube S}f(T)
则我们有:
f(S)=TS(1)STg(T)f(S)=\sum_{T\sube S}(-1)^{|S|-|T|}g(T)
f(S)f(S) 为最终状态为 SS 的答案,g(S)g(S) 为最终状态为 SS超集时的答案,即有:
g(S)=TSf(T)g(S)=\sum_{T\supe S}f(T)
则我们有:
f(S)=TS(1)STg(T)f(S)=\sum_{T\supe S}(-1)^{|S|-|T|}g(T)
证明都是简单的。

二项式反演

也就是只关心集合的大小,所以一样有所谓的子集和超集,常用的是超集。
超集:
f(x)f(x)恰好满足 xx 个限制的答案,g(x)g(x)钦定(至少) 满足 xx 个限制的答案。
g(x)=xi(ix)f(i)g(x)=\sum_{x\le i}\binom{i}{x}f(i)
一个方案会贡献 (Sx)\binom{|S|}{x} 次。
则我们有:
f(x)=xi(1)xi(ix)g(i)f(x)=\sum_{x\le i}(-1)^{x-i}\binom{i}{x}g(i)
子集:
略去。
形式非常简单,什么时候添加 (1)xi(-1)^{x-i} 只用看大小就好,上面的子集反演也一样。
是不是应该从 fwt 说起?

NOI2025 集合

因为 PQ=\empP\cap Q=\emp,有 val(PQ)=val(P)val(Q)val(P\cup Q)=val(P)val(Q)
定义 N={0,1,,n1}N=\{0,1,\dots,n-1\}U={0,1,,2n1}U=\{0,1,\dots,2^n-1\}。区分什么时候是全集。
Ans=PUQU[f(P)=f(Q)][PQ=\emp]val(P)val(Q)=SNPU[f(P)=S]QU[f(Q)=S][PQ=\emp]val(P)val(Q)\begin{aligned} Ans&=\sum_{P\sube U}\sum_{Q\sube U}[f(P)=f(Q)][P\cap Q=\emp]val(P)val(Q)\\ &=\sum_{S\sube N}\sum_{P\sube U}[f(P)=S]\sum_{Q\sube U}[f(Q)=S][P\cup Q=\emp]val(P)val(Q)\\ \end{aligned}
ff 相当于钦定一些二进制位必须全选,剩下的至少要不选一个,这不好处理。考虑把至少不选一个容斥掉,也就是超集反演。
这里反演的时候要对 PPQQ 分开反演两次(可以理解为先对 PP 反演,再对 QQ 反演,QQ 的时候全集会变),而不是一起做,不然 gg 没有实际意义,还是不好做。
Ans=SNPU[f(P)=S]QU[f(Q)=S][PQ=\emp]val(P)val(Q)=SNTPS(1)STPTQS(1)STQPU[f(P)TP]QU[f(Q)TQ][PQ=\emp]val(P)val(Q)=TPN,TQN(1)TP+TQ2TPTQPUQU[f(P)TP][f(Q)TQ][PQ=\emp]val(P)val(Q)\begin{aligned} Ans&=\sum_{S\sube N}\sum_{P\sube U}[f(P)=S]\sum_{Q\sube U}[f(Q)=S][P\cup Q=\emp]val(P)val(Q)\\ &=\sum_{S\sube N}\sum_{T_P\supe S}(-1)^{|S|-|T_P|}\sum_{T_Q\supe S}(-1)^{|S|-|T_Q|}\sum_{P\sube U}[f(P)\supe T_P]\sum_{Q\sube U}[f(Q)\supe T_Q][P\cup Q=\emp]val(P)val(Q)\\ &=\sum_{T_P\sube N, T_Q\sube N}(-1)^{|T_P|+|T_Q|} 2^{|T_P\cap T_Q|}\sum_{P\sube U}\sum_{Q\sube U}[f(P)\supe T_P][f(Q)\supe T_Q][P\cup Q=\emp]val(P)val(Q) \end{aligned}
对于一个元素 xUx\in U
  • xTPTQx\supe T_P\cup T_Q:在 U,VU,V 中都可以选;
  • 否则,若 xTPx\supe T_P:只在 UU 中可选;
  • 否则,若 xTQx\supe T_Q:只在 VV 中可选;
  • 否则不可选。
先算中间两种情况,再把第一种情况除掉。
Ans=TPN,TQN(1)TP+TQ2TPTQPUQU[f(P)TP][f(Q)TQ][PQ=\emp]val(P)val(Q)=TPN,TQN(1)TP+TQ2TPTQ(xTP(ax+1))(xTQ(ax+1))(xTPTQ2ax+1(ax+1)2)\begin{aligned} Ans&=\sum_{T_P\sube N, T_Q\sube N}(-1)^{|T_P|+|T_Q|} 2^{|T_P\cap T_Q|}\sum_{P\sube U}\sum_{Q\sube U}[f(P)\supe T_P][f(Q)\supe T_Q][P\cup Q=\emp]val(P)val(Q)\\ &=\sum_{T_P\sube N, T_Q\sube N}(-1)^{|T_P|+|T_Q|} 2^{|T_P\cap T_Q|}\left(\prod_{x\supe T_P}(a_x+1)\right)\left(\prod_{x\supe T_Q}(a_x+1)\right)\left(\prod_{x\supe T_P\cup T_Q}\frac{2a_x+1}{(a_x+1)^2}\right) \end{aligned}
又有交集又有并集,考虑去掉一个。
Ans=TPN,TQN(2)TP(2)TQ2TPTQ(xTP(ax+1))(xTQ(ax+1))(xTPTQ2ax+1(ax+1)2)=TN2T(xT2ax+1(ax+1)2)TP,TQ[TPTQ=T]((2)TP(xTP(ax+1)))((2)TQ(xTQ(ax+1)))\begin{aligned} Ans&=\sum_{T_P\sube N, T_Q\sube N}(-2)^{|T_P|}(-2)^{|T_Q|} 2^{-|T_P\cup T_Q|}\left(\prod_{x\supe T_P}(a_x+1)\right)\left(\prod_{x\supe T_Q}(a_x+1)\right)\left(\prod_{x\supe T_P\cup T_Q}\frac{2a_x+1}{(a_x+1)^2}\right)\\ &=\sum_{T\sube N}2^{-|T|}\left(\prod_{x\supe T}\frac{2a_x+1}{(a_x+1)^2}\right)\sum_{T_P,T_Q}[T_P\cup T_Q=T]\left((-2)^{|T_P|}\left(\prod_{x\supe T_P}(a_x+1)\right)\right)\left((-2)^{|T_Q|}\left(\prod_{x\supe T_Q}(a_x+1)\right)\right) \end{aligned}
明显是一个 or 卷积,那么这题就做完了,怎么样很简单吧。
注意有一个除 00 的问题,那由于最后 00 的次数必定不小于 00,在加法的时候只保留最低次的即可。

评论

0 条评论,欢迎与作者交流。

正在加载评论...