CDOJ 1294 天行廖的游戏 dp 容斥
天行廖的游戏
题目连接:
http://acm.uestc.edu.cn/#/problem/show/1294
Description
天行健,君子以自强不息。地势坤,廖爷以厚德载物
一日在喵哈哈村,天行廖和沈宝宝正在玩一个游戏。
天行廖分别在\(N\)个纸片上写上一个数字,并放到一个盒子中。
现在沈宝宝要从盒子中抓出任意张纸片。
如果沈宝宝抓出的纸片上的数字\(A\_{i1}\),\(A\_{i2}\),....\(A\_{ik}\)满足\(A\_{i1}\) & \(A\_{i2}\) & ....\(A\_{ik}\)$ = 0$ ( \(i\_{1} < i\_{2} … < i\_{k}\)),那么天行廖赢得这次游戏的胜利,否则沈宝宝赢。
Input
第一行输入\(1\)个整数\(N。\)(\(1 \leq N \leq 10^6\))
第二行输入\(N\)个整数\(A\_1,A\_2....A\_N\)。($1 \leq A_i \leq 10^6 $)
Output
输出获胜的方案数量。因为结果可能很大,输出答案对\(10^9+7\)取模的结果即可。
Sample Input
6
5 2 0 5 2 1
Sample Output
53
Hint
题意
题解:
首先,我们再看一遍题意:对于一个长度为n的数列a1,a2...an,挑出任意个数,使得这些数的且运算结果为0。
首先暴力2^n枚举是肯定不行的。考虑不那么暴力的DP做法,令dp[i][j]表示从前i个数选结果为j的方案有多少种,转移方程为dp[i][j] = sigma(dp[i - 1][k]) (k & a[i] = j),复杂度为n^3,显然也不行...
于是我们考虑是否能用容斥原理做。1e6的二进制表达式有20位,总方案数为2^n,然后我们减去结果第一位为1的方案数,第二位为2的方案数...第二十位为1的方案数,即某一位为1的方案数。然后根据容斥原理,我们再加上结果某两位为1的方案数,减去结果某三位为1的方案数...,加上全为1的方案数。假设F(i)为结果为i的方案数量(令F(0) = 2 ^ n),g(i)为i二进制下1的个数,则ans = sigma(F(i)*(-1)^(g(i)))。
那么现在问题即如何计算F(i)。若要使得k个数b1,b2...,bk的且运算为i,那么对于所有i为1的位,任意bj在该位置上也都为1,即bj & i = i。如果我们能算出满足aj & i = i的数的个数cnt(i),就能得到F(i) = 2 ^ cnt(i),于是问题转换为如何快速计算cnt(i)。
我们令cnt[k][i]表示只有前k位与i不同且满足aj & i = i的数的个数,边界cnt[0][i]表示正好为i的数的个数。现在分两种情况讨论cnt[k][i]的递推式:
1、i的第k位是1,那么cnt[k][i] = cnt[k - 1][i],因为若第k位不同,则与i作且运算是第k位为0,所以相当于只有前k-1位不同。
2、i的第k位是0,则是第k位0或1没有影响,对比第一种情况需要加上前k-1位不同且第k位为1的数的个数。显然这个方案数等于dp[k - 1][i + 2^k],则得到递推式cnt[k][i] = cnt[k - 1][i] + cnt[k - 1][i + 2 ^ k]。
因为位数K最大为log(1e6)约等于20,于是我们就能在O(NK)(K=20)的复杂度计算出cnt(i),并在O(N)的时间内完成容斥的计算,总时间复杂度为O(NK)。至此,我们解完了这题。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1 << 20;
const LL MOD = 1e9 + 7;
int n,m;
LL dp[21][N];
///dp[i][x]表示,二进制下只有前i位可能与x不同的数与x进行and运算仍然为x的数的个数
LL g[N];
bool s[N];
void init()
{
scanf("%d",&n);
g[0] = 1;
for(int i = 1;i <= n;i++) g[i] = (g[i - 1] << 1LL) % MOD;
int f0;
for(int i = 1;i <= n;i++)
{
scanf("%d",&f0);
dp[0][f0]++;
}
}
void work()
{
for(int i = 1;i <= 20;i++)
{
for(int j = 0;j < N;j++)
if( (j & (1 << (i - 1)) ) == 0)
dp[i][j] = dp[i - 1][j] + dp[i - 1][j | (1 << (i - 1))];
else
dp[i][j] = dp[i - 1][j],s[j] ^= 1;
}
LL ans = 0;
for(int i = 0;i < N;i++)
ans = ( ans + (s[i]?(-1LL):1LL) * g[dp[20][i]] + MOD ) % MOD;
printf("%lld\n",ans);
}
int main()
{
init();
work();
return 0;
}
CDOJ 1294 天行廖的游戏 dp 容斥的更多相关文章
- bzoj 3622 DP + 容斥
LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
- Codeforces 611C New Year and Domino DP+容斥
"#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...
- [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- CF285E Positions in Permutations(dp+容斥)
题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...
- BZOJ.2655.calc(DP/容斥 拉格朗日插值)
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
随机推荐
- 做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table【转】
做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table 浓缩版: 使用replicate_do_db和replicate_i ...
- java版云笔记(八)之关联映射
Mybatis关联映射 通过数据库对象之间的关联关系,反映到到实体对象之间的引用. 加载多个表中的关联数据,封装到我们的实体对象中. 当业务对数据库进行关联查询. 关联 <association ...
- linux下redis的安装与部署
一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...
- Mybatis的核心配置
之前了解了Mybatis的基本用法,现在学习一下Mybatis框架中的核心对象以及映射文件和配置文件,来深入的了解这个框架. 1.Mybatis的核心对象 使用MyBatis框架时,主要涉及两个核心对 ...
- kubeadm高可用master节点部署文档
kubeadm的标准部署里,etcd和master都是单节点的. 但上生产,至少得高可用. etcd的高可用,用kubeadm微微扩散一下就可以. 但master却官方没有提及. 于是搜索了几篇文档, ...
- ServiceWorker pwa缓存
index.js if ( navigator.serviceWorker ) { console.log("cache index") window.addEventListen ...
- Hibernate (开源对象关系映射框架)
一.基本介绍1.它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行: Hibern ...
- Unity3D 向量运算
写在前面的话,前两天有个朋友在QQ上问我 如何获取主角面朝方向一定区域中的敌人对象.这个命题看似简单,其实里面蕴含了很多数学方面的东西.今天刚好有时间我就彻底的把这个疑问写在博客中.希望可以帮助到他. ...
- 微信公共服务平台开发(.Net的实现)1 认证“成为开发者”
http://www.cnblogs.com/freeliver54/p/3725979.html http://www.it165.net/pro/html/201402/9459.html 这些代 ...
- 一道js试题
直接上试题 <script type="text/javascript"> var output = '123js'; var object = { output : ...