计数问题选讲

容斥篇

08:09 sconnect。求 n(n15)n(n\leq 15) 个点有向图中强连通子边图个数。

考虑图 GG 强连通当且仅当其不存在真子点集 VV' 满足 VV∁_VV' 的边都是 VVVV' 的。

尝试考虑 Θ(3n)\Theta(3^n) 的做法,状压 DP 枚举子集。设 fSf_S 表示只考虑点集 SS 时强连通方案数量。

图经 tarjan 算法缩点后将成为 DAG。考虑拓扑排序逐步剥离 DAG 的无出度点,故对无出度点容斥。

枚举无出度点集 TT,它们缩点后互相孤立。则 ST∁_STTT 边随意连。则 fS=2e(S,S)TSfSTgT2e(ST,T)f_S=2^{e(S,S)}-\sum_{T⫋S}f_{∁_ST}g_T2^{e(∁_ST,T)}。考虑容斥系数 gg

根据 1,2,31,2,3\dots 个无出度点情况类推得 $g_S=\sum_{k=1}^{|S|}\prod_{\cup_{i=1}^ks_i=S,\sum_{i=1}^k|s_i|=|S|,s_i\neq\emptyset,\min s_i<\min s_{i+1}}\prod_{i=1}^kf_{s_i}$(其中 s1ks_{1\dots k} 划分了 SS)。

08:29 Endless Spinn(n50)n(n\leq 50) 个元素,每次随机选择区间 [l,r][l,r] 标记其中所有元素。求标记所有元素期望次数。

Min-Max 容斥maxsSs=TS(1)T1mintTt\max_{s∈S}s=\sum_{T⊆S}(-1)^{|T|-1}\min_{t∈T}t

对于期望亦然成立。$E(\max_{s∈S}s)=\sum_{T⊆S}(-1)^{|T|-1}E(\min_{t∈T}t)$。

08:34 一层递归。初始为 00 值每次随机或 a1na_{1\dots n} 中的一个元素,求让 x=ori=1naix=\operatorname{or}_{i=1}^na_i 的期望。

pip_i 表示第 ii 位变成 11 的期望,则根据 min-max 容斥考虑 mintTpt\min_{t∈T}p_t,显然期望为 $\dfrac{n}{\sum_{i=1}^n[a_i\operatorname{or}t\neq 0]}$,可以 FWT 快速求解。

08:41 递归结束。

因为 nn 很大,不能用如上方法求 min\min,故考虑观察性质。钦定某些球 x1kx_{1\dots k} 不能选,那么一共有 i=1k+1Cxixi12\sum_{i=1}^{k+1}\operatorname{C}_{x_i-x_{i-1}}^2 可用区间数(x0=0,xk+1=n+1x_0=0,x_{k+1}=n+1)。设 fi,j,kf_{i,j,k}上一个取了 ii、球数奇偶性为 jj,可用区间数为 kk 的方案数

转移为 $f_{i,j,k}=\sum_{t=0}^{i-1}f_{t,j\oplus 1,k+\operatorname{C}_{i-t-1}^2}$。只要时间复杂度不超过 Θ(n4)\Theta(n^4) 即可。需要钦定 00 一定不选。

DP 套 DP 篇

把内层 DP 值作为状态进行二层递推。可以理解为基于 DP 的 DFA。内层 DP 值域需要有限。

08:56 Hero meet devil。给定字符串 S(S15,Σ=4)S(|S|\leq 15,|\Sigma|=4),对于每个 0iS0\leq i\leq|S|,问有多少长为 m(m103)m(m\leq 10^3)TT 使得 lcs(S,T)=i|\operatorname{lcs}(S,T)|=i

下层 DP 中求 SSTT 的 LCS。则 $f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1}+[S_i=T_j])$。把 DP 状态建图。把一列 nn 个元素压成一个点。

为减少状态数,考虑限制 fi{fi1,fi1+1}f_i∈\{f_{i-1},f_{i-1}+1\},则点数仅有 Θ(2n)\Theta(2^n),时间复杂度 Θ(2nmΣ)\Theta(2^nm|\Sigma|)

09:11 Square。给定 n×n(n8)n\times n(n\leq 8) 的 01 二维数组,某些位置必须为 11。对于每个 0in0\leq i\leq n,求多少种数组满足其中最大全 00 正方形边长为 ii

下层 DP 中求最大正方形边长,转移为 $f_{i,j}=[a_{i,j}=0](\min(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1)$。逐行 DP 转移过多,考虑转为轮廓线 DP。状态同时要记录轮廓线的 m+1m+1 个 DP 值、当前列数和历史最大值。

因为若 fi,j>0f_{i,j}>0,则 fi,jfi,j1f_{i,j}\geq f_{i,j}-1,故状态数较少。

对于 ii 接近 nn 的情况,可以枚举 i×ii\times i00 正方形存在位置并将存在性与最大性容斥。于是将 ii 分为大小两部分,分别采用不同方式求解。

??:?? OneBlack。给定 n×m(n,m30)n\times m(n,m\leq 30) 的 012 二维数组,其中有些点确定为 22,其余点需要为 0011。问有多少种数组满足对于所有无 22 的从 (1,1)(1,1) 走到 (n,m)(n,m)n+m1n+m-1 长路径(以下称路径)都恰好包含一个 11

路径不会到的点可以随意选择。对于可能到的点,因为合法方案中到某个点所有路径含 11 数一定相等,因此内层 DP fi,jf_{i,j} 表示 (1,1)(1,1) 走到 (i,j)(i,j) 的所有路径中 11 的个数。

因为 ff 值只有 0011ff 值为 11 点后续一定都为 11,因此状态数很少,可以通过。

??:?? Jigsaw Puzzle。对于一个 n×m(n500,m6)n\times m(n\leq 500,m\leq 6) 的棋盘的子集,求它有多少个子集可以被 1×21\times 2 砖刚好覆盖。

原始内层逐行 DP 状态为 282^8 个布尔值、上层 DP 需 2642^{64},考虑优化。因 贪心从左连续两空位填横砖 一定不会更劣(仅考虑轮廓线以下格子,若不纵造成下方点无法匹配,不横右方点也无法匹配),可将连续两空位方案重定向,状态数降到 2212^{21}

看起来状态数还是太大了。但如果先搜索转移能得到那些状态,会发现基于以上贪心算法得到的状态数远远少与 2212^{21},便可以通过了。

??:?? StringPath。给定长 n+m1n+m-1 的字符串 SSTT。求多少种 n×m(n,m8,Σ=26)n\times m(n,m\leq 8,|\Sigma|=26) 的矩阵满足存在两条从 (1,1)(1,1)(n,m)(n,m)n+m1n+m-1 的路径沿途分别为 SSTT

对于内层 DP,fi,j,s,tf_{i,j,s,t} 表示到点 (i,j)(i,j) 时路径是否能为 SSTT 的前缀。每个 (i,j)(i,j) DP 值有 44 种,还是用轮廓线 DP 优化,状态数可降到 4m4^m

枚举分类优化篇

??:?? The only survivaln(n12)n(n\leq 12) 个点无向完全图,边权为自然数且上限 l(l109)l(l\leq 10^9),求多少个图 11nn 最短路为 k(k12)k(k\leq 12)

考虑枚举 11ii 最短路 did_i。由此,对于边 (u,v)(u,v) 应当有 w(u,v)dudvw(u,v)\geq|d_u-d_v|;同时,对于 u>1u>1,需要有 vv 满足 dv+w(u,v)=dud_v+w(u,v)=d_u。显然 did_i 值可简化为 0k0\dots k>k>k。因点 2n12\dots n-1 平等,枚举 d2d_2dn1d_{n-1} 中各标号数量并根据以上两个原则计算边方案数即可。

??:?? 扑克牌n(n30)n(n\leq 30) 个元素 (ai,bi)(ai<10,bi<3)(a_i,b_i)(a_i<10,b_i<3),需要找到排列 p1np_{1\dots n} 的个数,满足对于 1<in1<i\leq n,有 api1=apibpi1=bpia_{p_{i-1}}=a_{p_i}∨b_{p_{i-1}}=b_{p_i}。每种 (a,b)(a,b) 个数最多为 33

aa 元素连 AA 边、同 bbBB 边。AA 边的团分为若干部分,每部分内部随便走,可缩为一些首、末 bb 值形式的边。对所有同 aa 元素搜索枚举即可。

缩完后 bb 值间共有 323^2 种有向边。将 DP 状态设为 99 种边的数量 进行递推,并记录 AA 团内部连接方案种数;最后,对于每种形态,需要乘上欧拉路的走法。

??:?? Substring Pairs。求所有长 n(n200,Σ103)n(n\leq 200,|\Sigma|\leq 10^3) 字符串的本质不同 m(m50)m(m\leq 50) 长子串数的和。

设长串 SS、子串 TT。对于特定的 TT,可以枚举其在 SS 中位置并经典容斥计算对应的 SS 数量。基于以上求解 只和的所有 TT 的 border 长有关,可依 border 集合分类,求各类的 TT 数量与答案。

尽管 TT 类型数似乎是 Θ(2T)\Theta(2^{|T|}) 的,但因为 border 间的干涉非常严重,真正的 border 集合数量非常少,可通过加 border 后立即补全的 DFS 求出全部。

求每种 border 集合 ssTT 个数,可以先转化为 border 集合包含 ss,然后再暴力找包含 ss 的合法集合减掉容斥。

期望线性篇

将期望值拆为满足期望可加性的若干类型小期望,最后求和即可。

??:?? MST。给定 n(n10)n(n\leq 10) 的简单有效图,每条边在 [0,1][0,1] 均匀随机。求图最小生成树长度和的期望。

根据概率原理,有边长相同的概率为 1=0\frac{1}{\infin}=0,可忽略这种情况并认为最小生成树一定唯一。考虑一条边对总和的期望贡献。

(u,v,w)(u,v,w) 出现在最小生成树中,uuvv 不能被长度小于 ww 的边连起来枚举 uu 在小于 ww 边的联通分量 即可得到 ww(u,v)(u,v) 不互通 的概率的关系,用传统状压 DP 即可。因为 DP 的系数永远是 wdw^d(1w)d(1-w)^d,此关系是一个多项式 p(w)=i=0kaiwip(w)=\sum_{i=0}^ka_iw^i。则 (u,v)(u,v) 对最短路产生的期望贡献为 w=01p(w)=i=0kaii+1∫_{w=0}^1p(w)=\sum_{i=0}^k\frac{a_i}{i+1}

??:?? ClosestRabbitn×m(n,m20)n\times m(n,m\leq 20) 的矩阵随机放 rr 个球。随后将每个球与离它最近的球联通,对于同距离情况第二关键字为行号、第三关键字为列号。求连通块期望个数。

uu 最近点为 f(u)f(u)。转化为有向边 (u,f(u))(u,f(u)),可形成基环树。原联通块数就是基环树的环数

设点 uu 在环上前驱为 pp,后继为 ss,则 dis(u,p)dis(u,s)\operatorname{dis}(u,p)\geq\operatorname{dis}(u,s),否则 f(u)sf(u)\neq s,矛盾。此不等式绕环一圈即可得 环上相邻两点距离处处相等

对于环上位置 (xu,yu)(x_u,y_u) 在比较中最小的点 uu,因为上述结论,有 f(p)=f(s)=uf(p)=f(s)=u。这个条件可以推出 环的长度只能为 22

随后原问题变成了 求满足 f(u)=v,f(v)=uf(u)=v,f(v)=u 值的期望数对 (u,v)(u,v)。于是我们枚举位置对 (x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2),求它们成为以上数对的概率。排除掉会破坏二元环性质的点的情况,然后乘上两个点都有球的概率即可。

??:?? BitToggler。给定长 n(n20)n(n\leq 20) 01 串 SSii(初值给定)与 w=0w=0,重复操作直到 SS 全为 00irand(n)i'\larr\operatorname{rand}(n)ww+iiw\larr w+|i-i'|Si1SiS_{i'}\larr 1-S_{i'}iii\larr i'。求最后 ww 期望值。

枚举数对 (u,v)(u,v),分别考虑 i=u,i=vi=u,i'=v 的期望步骤数,将这个期望乘上 uv|u-v| 加到总期望即可。对于一个状态,我们记下 SuS_uSvS_v 的值,而 uuvv 以外的点互相平等,只用记录 11 的个数,以及指针位置,其中非 uuvv 的点压到一起。这样一共有 3×22(n1)3\times 2^2(n-1) 种状态,答案为 (Su,Sv,i=1n[iuiv]Si,i)(S_u,S_v,\sum_{i=1}^n[i\neq u∧i\neq v]S_i,i') 随机游走到 (0,0,0,)(0,0,0,\dots) 的期望次数,高斯消元即可。

Atcoder Grand Contest

DP 篇

ACG020E Encoding Subsets

定义合法变化为:

00,110\rarr 0,1\rarr 1 合法。

ABA\rarr BCDC\rarr D 合法,则 ABCDAB\rarr CD 合法。

g13d

g17f

g12f

g08

g20f


g17c

g07c

g17e

g18f

g04f

r153f

r152f


g18e

r163f

r154f


g21e

g21f

g22f


后记

$\huge\sf{\color{#F00}T\color{#0C0}E\color{#FFA500}T\color{#F0F}R\color{#0EE}I\color{#EE0}S}\ Hot\ News!$

$\sf Wow!\ Player\ \text{Z\color{#F00}KYGT1}\ competed\ in$

40 Lines Challenge, placed a VERTICAL\sf 40\ Lines\ Challenge,\ placed\ a\ VERTICAL

$\sf{\color{#0EE}I-Block}\ and\ gained\ +19 \stackrel{\ \ \ \ \ \ \color{#F0F}T-SPIN}{DOUBLE}s$

taking lines cleared 38\sf taking\ lines\ cleared\ 38

Share it!\huge\sf Share\ it!