zoukankan      html  css  js  c++  java
  • Jzzhu and Numbers CodeForces

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

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

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

    首先根据容斥可以得到

    $$ans=sumlimits_{Ssubseteq 2^{U}}(-1)^{|S|}(2^{f_S}-1) ag{1}$$

    其中$f_S=sumlimits_{Tin a}[Tsupseteq S] ag{2}$

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

    $$f_S=sumlimits_{Tsupseteq S} {cnt}_T ag{3}$$

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

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

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

    那么就有$$f_{i,S} =   egin{cases} f_{i-1,S}  & ext{$iin S$} \ f_{i-1,S}+f_{i-1,S+{i}} & ext{$i otin S$} ag{4}end{cases}$$

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

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

    $$h(S)=sumlimits_{Tsupseteq S}(-1)^{|T|-|S|}(2^{f_{T}}-1) ag{5}$$

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

    $$f_S=sumlimits_{Tsubseteq S}{cnt}_T ag{6}$$

    然后容斥可以得到

    $$h(S)=sumlimits_{Tsubseteq S}(-1)^{|S|-|T|}(2^{f_{T}}-1) ag{7}$$

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

    $$f_{i,S} =   egin{cases} f_{i-1,S}  & ext{$i otin S$} \ f_{i-1,S}+f_{i-1,S-{i}} & ext{$iin S$} ag{8}end{cases}$$

  • 相关阅读:
    面向对象之继承
    面向对象之封装
    进程相关(一)
    面向对象之反射,元类
    实现效果从中间变大
    如何扒一个网站
    java例程练习(引用类型数据的排序和查找)[外篇]
    java例程练习(Iterator)
    java例程练习(增强的for循环)
    java例程练习(Map接口及自动打包、解包)
  • 原文地址:https://www.cnblogs.com/uid001/p/10430314.html
Copyright © 2011-2022 走看看