N个非负整数a1, a2, ..., an.
我们将调用一系列索引i1,i2,...,ik(1≤i1< i2< ...<ik≤n)一组大小k。
存在多少组ai1 & ai2 & ... & aik = 0 (1 ≤ k ≤ n)
。
操作x & y denotes bitwise AND
两个数字的操作。Problem
方法
在此问题中使用包含 - 排除原则。
Let f(x) be the count of number i where Ai&x = x.
设g(x)为x的二进制表示中的1的个数。然后答案等于。
(-1)^g(x)*2^f(x)
代码: Intially: for(int i = 0; iAnd Second Loop:
for(int i=0;i<20;i++) {
for(int j=0;j<(1<<20);j++) {
if(0 == (j & (1<<i))) {
cnt[j | (1<<i)] += cnt[j];
}
}
}
最后:
for(int i=0;i<(1<<20);i++) {
int mask = 20 % 2;
for(int j=0;j<20;j++) if(i & (1<<j)) mask ^= 1;
if(mask == 0) ret = (ret + pows[cnt[i]]) % MOD;
else ret = (ret + MOD - pows[cnt[i]]) % MOD;
}
第二个循环如何工作以及如何应用包含 - 排除原则是在最后一个循环中。我无法想象集合形成,如图A intersection B
如何