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

Posted uid001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jzzhu and Numbers CodeForces - 449D (容斥,dp)相关的知识,希望对你有一定的参考价值。

大意: 给定集合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) \tag1$$

其中$f_S=\sum\limits_T\in a[T\supseteq S] \tag2$

用$cnt_S$来表示给定每个$S$的出现次数, 就有

$$f_S=\sum\limits_T\supseteq S cnt_T \tag3$$

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

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

记$f_i,S$为只考虑前$i$种元素时的$f_S$的值

那么就有$$f_i,S =   \begincases f_i-1,S  & \text$i\in S$ \\ f_i-1,S+f_i-1,S+\i\ & \text$i\notin S$ \tag4\endcases$$

初值$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)\tag5$$

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

$$f_S=\sum\limits_T\subseteq Scnt_T \tag6$$

然后容斥可以得到

$$h(S)=\sum\limits_T\subseteq S(-1)^|S|-|T|(2^f_T-1) \tag7$$

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

$$f_i,S=$$

 

以上是关于Jzzhu and Numbers CodeForces - 449D (容斥,dp)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 449D:Jzzhu and Numbers(高维前缀和)

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

CF449D Jzzhu and Numbers 高维前缀和

Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)

CF449D Jzzhu and Numbers (状压DP+容斥)

Codeforces Round #257 (Div. 1) D - Jzzhu and Numbers 容斥原理 + SOS dp