像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

2023-02-06 17:54阅读: 94评论: 0推荐: 0

dp 状物容斥 笔记

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

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


来源神秘

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

n,m2000

直接 O(nmlogn) dp 。

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

n,m105

考虑容斥:

枚举有几个不合法的 ai1<>ai ,设有钦定 f(S) 不合法的数的方案数为 f(S)ans=f(S)×(1)|S|

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

OXXXOXXOOOXO=OXXX|OXX|O|O|OX|O

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

dp(i)=dp(ij)×w(j)×g(j)

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

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

可以发现这种段的长度是 O(logm)

时间复杂度 O(nlogm+m poly log m)

n,1018,m106

每一项之和前 logn 项相关。

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

时间复杂度 O(log3mlogn+m poly log m)

使用不同筛法配合根号分治可以解决 n1018,m109


CF1728G

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

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

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

ans=f(T)×(1)|T|

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

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

所以考虑 dp :

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

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


ARC101E

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

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


ABC236 Ex

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

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

那么答案等于 SEf(S)×(1)|S|

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

于是有了 O(2n2×poly n) 的做法。

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

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

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

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

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

dp(S)=uT,V=STdp(U)×w(T)×g(T)

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

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

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

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

考虑加入 连通块 的若是三个点,则系数应该是 13=2

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

posted @   寂静的海底  阅读(94)  评论(0编辑  收藏  举报
历史上的今天:
2022-02-06 atcoder近期比赛记录
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起