题解

刚刚学习了高维前缀和

这道题就肥肠简单了

高维前缀和其实原理肥肠简单

就是每次只考虑一维,然后只做这一维的前缀和

最后求出的就是总前缀和了

那么对于这道题

也就很简单了

发现选择的所有数每一位都必须不能所有数都是1

那么可以考虑一个简单的容斥

设\(g_i\)表示至少\(i\)的二进制下的这几维为1的方案数

那么就可以用类似高维前缀和来统计\(g_i\)

也就是统计ta作为哪些元素的子集

然后枚举选那几位

答案就是\((-1)^{|S|}{2^{g_{i}}}\)

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 2000005 ;
const int mod = 1e9 + 7 ;
using namespace std ;
inline int read() {
char c = getchar() ; int x = 0 , w = 1 ;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }
return x*w ;
} int n , val[M] , f[M] , pw2[M] , ans ; inline int chk(int S) {
int ret = 0 ;
for(int i = 1 ; i <= 20 ; i ++)
if(S & (1 << (i - 1)))
++ ret ;
return ret ;
}
int main() {
n = read() ;
for(int i = 1 ; i <= n ; i ++) {
val[i] = read() ;
f[val[i]] ++ ;
}
pw2[0] = 1 ;
for(int i = 1 ; i <= n ; i ++) pw2[i] = 1LL * pw2[i - 1] * 2 % mod ;
for(int i = 0 ; (1 << i) <= 1000000 ; i ++) {
for(int j = (1 << 20) - 1 ; j >= 0 ; j --)
if(!(j & (1 << i)))
f[j] = (f[j] + f[j ^ (1 << i)]) % mod ;
}
for(int i = 0 , sz ; i < (1 << 20) ; i ++) {
sz = chk(i) ;
if(sz & 1) sz = -1 ;
else sz = 1 ;
ans = ((ans + sz * (pw2[f[i]] - 1)) % mod + mod) % mod ;
}
printf("%d\n",ans) ;
return 0 ;
}

CF449D Jzzhu and Numbers的更多相关文章

  1. cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)

    题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...

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

    题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的 ...

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

    D - Jzzhu and Numbers 这个容斥没想出来... 我好菜啊.. f[ S ] 表示若干个数 & 的值 & S == S得 方案数, 然后用这个去容斥. 求f[ S ] ...

  4. Jzzhu and Numbers

    Jzzhu and Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. 【CF449D】Jzzhu and Numbers

    题目 提供一个非容斥做法--\(FWT\) 我们发现我们要求的东西就是一个背包,只不过是在\(and\)意义下的 自然有 \[dp_{i,j}=\sum_{k\&a_i=j}dp_{i-1,k ...

  6. Codeforces 449D Jzzhu and Numbers

    http://codeforces.com/problemset/problem/449/D 题意:给n个数,求and起来最后为0的集合方案数有多少 思路:考虑容斥,ans=(-1)^k*num(k) ...

  7. D. Jzzhu and Numbers

    这就是这个题目的意思,真的感觉这个思想是太神奇了,我这种菜逼现在绝壁想不到这样的证明的过程的,还有就是这个题的推道过程,以下思路纯属借鉴卿学姐的,还是自己太菜了,,,, 讲道理这种问题我真的想不到用容 ...

  8. Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)

    题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...

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

    大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其 ...

随机推荐

  1. cors跨域深刻理解

    1.跨域问题只出现在前端和后端不在同一个主机上.前后端在同一个主机上不会出现跨域问题. 2.浏览器的一种自我保护机制,不允许出现本地浏览器ajax异步请求访问127.0.0.1以外的系统,因为浏览器不 ...

  2. maven之发布项目到nexus【clean deploy命令】

    原文:http://m.blog.csdn.net/article/details?id=49667971 当我们的项目开发完成以后,可能要进行发布(如果是独立的项目,就不需要发布啦,如果是模块项目, ...

  3. 【c++】动态内存

    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.注意:const常量在定义时必须初始化 栈区:在执行函数时,函数内局部变量的存储单 ...

  4. linux 查找目录下的文件内容并替换(批量)

    2.sed和grep配合 命令:sed -i s/yyyy/xxxx/g `grep yyyy -rl --include="*.txt" ./` 作用:将当前目录(包括子目录)中 ...

  5. fixedBox固定div漂浮代码 支持ie6以上大部分浏览器

    fixedBox固定div漂浮代码 支持ie6以上大部分浏览器 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  6. [Sciter] Script与Native交互

    原帖地址:http://www.cnblogs.com/yinxufeng/p/5653920.html Script与Native交互基础简化方式Script调用NativeNative调用Scri ...

  7. redis-3.0.3安装測试

    $ tar xzvf redis-3.0.3.tar.gz $ cd redis-3.0.3 $ make     //编译 编译完毕进行 $ make test 命令測试 得到例如以下错误信息: c ...

  8. java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

    package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...

  9. Java反射的基本应用

    反射机制,程序在运行时加载新的类,使程序更加灵活 public class HelooReflect { public static void main(String[] args) { // 获取类 ...

  10. The type exists in both DLLs

    2>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\c0b37647\aaceda91\Ap ...