码迷,mamicode.com
首页 > 其他好文 > 详细

Jzzhu and Numbers CodeForces - 449D (容斥,dp)

时间:2019-07-19 18:56:53      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:set   范围   code   limit   简单   $1   ups   二进制   for   

大意: 给定集合a, 求a的按位与和等于0的非空子集数.

 

为了方便表述, 把每个数看成一个二进制位表示的集合, 例如十进制的$10$就看做集合$\{1,3\}$.

假设给定数的范围在$[0,2^{m})$内, 记$U=\{0,1,2,\cdots,m-1\}$.

首先根据容斥可以得到

$$ans=\sum\limits_{S\subseteq 2^{U}}(-1)^{|S|}(2^{f_S}-1) \tag{1}$$

其中$f_S=\sum\limits_{T\in a}[T\supseteq S] \tag{2}$

用${cnt}_S$来表示给定每个$S$的出现次数, 就有

$$f_S=\sum\limits_{T\supseteq S} {cnt}_T \tag{3}$$

快速计算$(3)$式其实就是与和的莫比乌斯变换.

显然可以$O(3^{m})$枚举子集计算, 但是还有$O(m2^{m})$的算法.

记$f_{i,S}$为只考虑前$i$种元素时的$f_{S}$的值

那么就有$$f_{i,S} =   \begin{cases} f_{i-1,S}  & \text{$i\in S$} \\ f_{i-1,S}+f_{i-1,S+\{i\}} & \text{$i\notin S$} \tag{4}\end{cases}$$

初值$f_{-1,S}={cnt}_{S}$, 最终$f_{S}=f_{mx-1,S}$, 那么这道题就解决了.

然后再简单推广一下, 考虑与和等于任意值情形, 用容斥可以得到与和为$S$时的答案为

$$h(S)=\sum\limits_{T\supseteq S}(-1)^{|T|-|S|}(2^{f_{T}}-1)\tag{5}$$

若改为或和的情形, 类比与和的求法有

$$f_S=\sum\limits_{T\subseteq S}{cnt}_T \tag{6}$$

然后容斥可以得到

$$h(S)=\sum\limits_{T\subseteq S}(-1)^{|S|-|T|}(2^{f_{T}}-1) \tag{7}$$

其中$(6)$式则是或和的莫比乌斯变换, 用同样的方法有

$$f_{i,S}=$$

 

Jzzhu and Numbers CodeForces - 449D (容斥,dp)

标签:set   范围   code   limit   简单   $1   ups   二进制   for   

原文地址:https://www.cnblogs.com/uid001/p/10430314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!