dp 状物容斥 笔记

dp 状物容斥指的是使用 dp 来完成容斥的过程,将容斥系数拆分到每一步进行dp。

通常当你有容斥做法,且适配的子集条件较为一般,且数据范围不足通过时考虑使用 dp状物描述容斥。


来源神秘

求长度为 $n $ 值域为 \(m\) 的序列个数,满足前一个数不是后一个数的非本身的倍数。

\(n,m\leq 2000\)

直接 \(O(nm\log n)\) dp 。

发现这个做法行不通,走不下去,最多整除分块 \(m\)

\(n,m\leq 10^5\)

考虑容斥:

枚举有几个不合法的 $a_{i-1} <->a_i $ ,设有钦定 \(f(S)\) 不合法的数的方案数为 \(f(S)\)\(ans = \sum f(S) \times (-1)^{|S|}\)

那么可以将数列拆成若干个形如 一个不钦定 + 若干个钦定 段组成。

$\text{OXXXOXXOOOXO} =\text{OXXX|OXX|O|O|OX|O} $

发现容斥的子集搭配之间没有特殊的限制条件,所以进行 dp 。

\(dp(i) = dp(i-j) \times w(j)\times g(j)\)

相当于枚举最后这个钦定段的长度

\(w\) 表示长为 \(j\) 的如上的段数,\(g(j)\) 表示容斥系数,显然当 \(j\) 为奇数的时 \(g(j) = 1\) , 否则为 \(-1\)

可以发现这种段的长度是 \(O(\log m)\)

时间复杂度 \(O(n\log m+ m \text{ poly log } m)\)

\(n,\leq 10^{18} , m\leq 10^6\)

每一项之和前 \(\log n\) 项相关。

可以使用矩阵优化上述转移。

时间复杂度 \(O(\log^3 m\log n+ m \text{ poly log } m)\)

使用不同筛法配合根号分治可以解决 \(n\leq 10^{18},m\leq 10^9\)


CF1728G

std 是直接容斥并计算每一项的系数

有较为优秀的多项式复杂度做法。

容斥即枚举点集 \(T\) 并钦定 \(T\) 不合法。

\(ans = \sum f(T) \times (-1) ^{|T|}\)

\(f(T)\) 可以通过计算两个相邻的钦定不被覆盖的关键点之间的方案数求出。

容易发现这个容斥是没有后效性的,之前的每个集合都可以匹配或者不匹配现在的子集。

所以考虑 dp :

\(dp(i)\) 表示前 \(i\) 个位置 的容斥答案。

\(dp(i) = dp(j) \times w(i,j)\times g(i,j)\) w 表示钦定 \([i,j]\) 内的点都不覆盖 \(i , j\) 的方案数 , g 表示容斥系数,在这里显然是 -1 。


ARC101E

虽然是二项式反演,但也用了类似的思想 :

将容斥系数分到每一步去乘。


ABC236 Ex

限制很多没法做的题,而且出现了 “两两不同” 考虑容斥。

将原问题抽象为图上问题 , 钦定某些点必须相同表现为在图上连边。

那么答案等于 \(\sum _{S \in E} f(S)\times(-1)^{|S|}\)

边子集的联通块就是要求相等的等价类。

于是有了 \(O(2^{n^2}\times \text{poly } n )\) 的做法。

边子集太大了,没法枚举,考虑点集。

因为新加入的点集可以和原本的点集对应构成点集,没有限制,所以考虑 dp 。

\(dp(S)\) 表示点集 \(S\) 考虑 \(S\) 内部的边的答案 。

类似连通图计数地,我们枚举一个点集 \(T\) 表示点 \(u\) 所在的连通块。

那么原图就变成了 \(V = S - T , T\) 了,需要考虑在这两边各选取一些子集搭配计算系数。

\(dp(S) = \sum_{u\in T, V=S-T} dp(U) \times w(T)\times g(T)\)

\(g(T)\) 表示容斥系数,在这里好像不是很能够方便地求出,但是显然只和大小相关。

枚举边数和图的连通性是可以求出,但是有简单的做法:

考虑加入 连通块 的若是一个点,则系数应该是 \(1\)

考虑加入 连通块 的若是两个点,则系数应该是 \(-1\)

考虑加入 连通块 的若是三个点,则系数应该是 \(1-3 = 2\)

考虑加入的 连通块 的边数,再次枚举一个连通块割出来 :若这个连通块的大小为 \(x,x\leq n -2\) ,则剩下了至少 \(2\) 个点,剩下部分的方案数是 \(2^p\) 必然是 \(2\) 的倍数,在奇数偶数条边的方案数是相同的,所以表示为一个连通块 + 一个孤点的形态,枚举孤点,所以 \(g(i)=g(i-1)*(i-1)*-1=(i-1) \times i!\)

posted @ 2023-02-06 17:54  寂静的海底  阅读(64)  评论(0编辑  收藏  举报