【做题记录】ARC096E Everything on It
-
- 算法:容斥、组合
题目:
对于集合 ,求它的子集族中,有多少个满足:
-
任意两个子集互不相同;
-
都在其中至少出现了 次。
答案对 取模。
题解:
采用容斥。
钦定 个数出现 次,不妨设为
分两类。
- 不含
很简单,即 个数字没有第二种限制,随便放,故有 中子集,加上每个子集要么选要么不选,所以共 种。
- 含有 至少一次
枚举 表示其个数,
将 个数分入 个集合,但这和斯特林数不太一样,因为有的数可以不分,所以相当于是将那些出现 次的分到 个集合中去。
对于每个集合,只需满足至少出现一次的 ,其余 的可有可无。
所以就是 个数分入 个集合的方案数,就是 (因为有 个集合)
但题中 个数不一定要全放完,这难以处理,所以我们直接强行让它放完,那么我们可以在 个集合后面在新建一个集合(垃圾堆),这里面把那些没选的数往里面丢。
但这样有两个问题。一是我放完后无法分辨哪个是新增的垃圾堆哪个是原来的 个集合。二是我有可能放完 个集合后没有东西可往垃圾堆里丢了。
此时我们可以考虑分类。
第一种就是此时没有剩余可以丢进垃圾堆了,所以就只是单纯地 个数分入 个集合,即 种。
第二种就是还有可以往垃圾堆丢的,那么此时的垃圾堆其实可以看成也是一个普通的堆,那么就是 个数往 个集合里放,一共有 种。然后因为我们将垃圾堆看成普通的堆,所以我么还要从 个堆中选一个当垃圾堆,故还要再乘上 。
所以总方案就是
我们不妨假设 表示 没有出现。
所以答案就是先枚举 ,然后乘上 即组合数即可。
即
而 即为第一种情况乘上第二种情况,
总的时间复杂度 。
本文作者:trsins
本文链接:https://www.cnblogs.com/trsins/p/15776587.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步