dp 状物容斥 笔记
dp 状物容斥指的是使用 dp 来完成容斥的过程,将容斥系数拆分到每一步进行dp。
通常当你有容斥做法,且适配的子集条件较为一般,且数据范围不足通过时考虑使用 dp状物描述容斥。
来源神秘
求长度为 值域为 的序列个数,满足前一个数不是后一个数的非本身的倍数。
直接 dp 。
发现这个做法行不通,走不下去,最多整除分块 。
考虑容斥:
枚举有几个不合法的 ,设有钦定 不合法的数的方案数为 ,。
那么可以将数列拆成若干个形如 一个不钦定 + 若干个钦定 段组成。
发现容斥的子集搭配之间没有特殊的限制条件,所以进行 dp 。
相当于枚举最后这个钦定段的长度
表示长为 的如上的段数, 表示容斥系数,显然当 为奇数的时 , 否则为 。
可以发现这种段的长度是 。
时间复杂度
每一项之和前 项相关。
可以使用矩阵优化上述转移。
时间复杂度 。
使用不同筛法配合根号分治可以解决 。
CF1728G
std 是直接容斥并计算每一项的系数
有较为优秀的多项式复杂度做法。
容斥即枚举点集 并钦定 不合法。
可以通过计算两个相邻的钦定不被覆盖的关键点之间的方案数求出。
容易发现这个容斥是没有后效性的,之前的每个集合都可以匹配或者不匹配现在的子集。
所以考虑 dp :
表示前 个位置 的容斥答案。
w 表示钦定 内的点都不覆盖 的方案数 , g 表示容斥系数,在这里显然是 -1 。
ARC101E
虽然是二项式反演,但也用了类似的思想 :
将容斥系数分到每一步去乘。
ABC236 Ex
限制很多没法做的题,而且出现了 “两两不同” 考虑容斥。
将原问题抽象为图上问题 , 钦定某些点必须相同表现为在图上连边。
那么答案等于
边子集的联通块就是要求相等的等价类。
于是有了 的做法。
边子集太大了,没法枚举,考虑点集。
因为新加入的点集可以和原本的点集对应构成点集,没有限制,所以考虑 dp 。
表示点集 考虑 内部的边的答案 。
类似连通图计数地,我们枚举一个点集 表示点 所在的连通块。
那么原图就变成了 了,需要考虑在这两边各选取一些子集搭配计算系数。
表示容斥系数,在这里好像不是很能够方便地求出,但是显然只和大小相关。
枚举边数和图的连通性是可以求出,但是有简单的做法:
考虑加入 连通块 的若是一个点,则系数应该是 。
考虑加入 连通块 的若是两个点,则系数应该是 。
考虑加入 连通块 的若是三个点,则系数应该是 。
考虑加入的 连通块 的边数,再次枚举一个连通块割出来 :若这个连通块的大小为 ,则剩下了至少 个点,剩下部分的方案数是 必然是 的倍数,在奇数偶数条边的方案数是相同的,所以表示为一个连通块 + 一个孤点的形态,枚举孤点,所以 。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17096238.html,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-02-06 atcoder近期比赛记录