CF449D Jzzhu and Numbers

题解
刚刚学习了高维前缀和
这道题就肥肠简单了
高维前缀和其实原理肥肠简单
就是每次只考虑一维,然后只做这一维的前缀和
最后求出的就是总前缀和了
那么对于这道题
也就很简单了
发现选择的所有数每一位都必须不能所有数都是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的更多相关文章
- cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)
题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...
- CF449D Jzzhu and Numbers (状压DP+容斥)
题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的 ...
- Codeforces Round #257 (Div. 1) D - Jzzhu and Numbers 容斥原理 + SOS dp
D - Jzzhu and Numbers 这个容斥没想出来... 我好菜啊.. f[ S ] 表示若干个数 & 的值 & S == S得 方案数, 然后用这个去容斥. 求f[ S ] ...
- Jzzhu and Numbers
Jzzhu and Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 【CF449D】Jzzhu and Numbers
题目 提供一个非容斥做法--\(FWT\) 我们发现我们要求的东西就是一个背包,只不过是在\(and\)意义下的 自然有 \[dp_{i,j}=\sum_{k\&a_i=j}dp_{i-1,k ...
- Codeforces 449D Jzzhu and Numbers
http://codeforces.com/problemset/problem/449/D 题意:给n个数,求and起来最后为0的集合方案数有多少 思路:考虑容斥,ans=(-1)^k*num(k) ...
- D. Jzzhu and Numbers
这就是这个题目的意思,真的感觉这个思想是太神奇了,我这种菜逼现在绝壁想不到这样的证明的过程的,还有就是这个题的推道过程,以下思路纯属借鉴卿学姐的,还是自己太菜了,,,, 讲道理这种问题我真的想不到用容 ...
- Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)
题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...
- Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)
大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其 ...
随机推荐
- foobar2000使用cue文件播放时出现Unable to open item for playback (Object not found):的问题解决
如下错误: 一般是找不到APE文件导致的.解决方法如下: 1.打开APE文件,对一下路径修改即可.
- java集合框架 hashMap 简单使用
参考文章:http://blog.csdn.net/itm_hadf/article/details/7497462 通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷. 加载因 ...
- ubuntu磁盘分区和挂载
- 为RAC私有网络配置网卡Bonding
在RAC的安装部署过程中.并不不过简单的安装完毕了事.整个安装过程要考虑可能出现的单点问题,当中比較重要的是私有网络. 私有网络是RAC节点间通信的通道.包含节点间的网络心跳信息.Cache fusi ...
- ScrollView阻尼效果
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- 【Mongodb教程 第九课 】MongoDB 删除文档
remove() 方法 MongoDB的 remove() 方法用于从集合中删除文档.remove() 方法接受两个参数.第一个是删除criteria ,第二是justOne标志: deletion ...
- Linux —— 压缩文件
Linux——压缩文件 为什么需要压缩文件? 文件在传输过程中,可能由于文件过大,传输所需时间过多.减少文件大小有两个明显的好处,一是可以减 少存储空间,二是通过网络传输文件时,可以减少传 ...
- MVC+ZTree大数据异步树加载
实例部分: 首先是为ZTree提供的数据规范,定义一个标准的接口,这样对于前台调用是清楚的,简单的,因为它返回的JSON数据将与ZTree默认的数据元素保持一致 /// <summary> ...
- 2015/12/29 eclipse应用 输出三角形
public class Myfirst { public static void main(String[] args) { System.out.println("hello world ...
- getHibernateTemplate()(Spring中常用的hql查询方法)
Spring中常用的hql查询方法(getHibernateTemplate()) --------------------------------- 一.find(String queryStrin ...