包含位掩码的包含 - 排除原则

时间:2015-07-21 15:00:33

标签: algorithm combinations bitmask

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如何

0 个答案:

没有答案