CodeForces 449D Jzzhu and Numbers

来源:互联网 发布:mac和nars口红哪个便宜 编辑:程序博客网 时间:2024/05/18 03:02

CodeForces 449D Jzzhu and Numbers

题目描述:

输入 N 个数,求这些数有多少个子集按位与之和等于 0

题解:

利用容斥原理,令 dpi 表示按位与之和至少有 i 个二进制位等于 1 的方案数,则:

Ans=i(1)idpi

考虑所有的二进制下含有 i1 的数 xi,1,xi,2 ,显然有 dpi=j(2fxi,j1) ,其中 fx 表示在二进制意义下有多少数“包含” x ,可以通过 DP 来求。

题目链接: vjudge 原网站

代码:

#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;#define MAXN 1000007#define MAXM 25const long long MOD = 1000000007LL;static int N;static long long ans = 0, bin[MAXN] = {1}, dp[MAXN];int main(){    for (int i = 1; i < MAXN; i++) bin[i] = bin[i-1] * 2 % MOD;    scanf("%d", &N);    for (int i = 0, x; i < N; i++) scanf("%d", &x), dp[x]++;    for (int j = 0; j < MAXM; j++)        for (int i = 0; i < MAXN; i++)            if ((1 << j) & i) (dp[i ^ (1 << j)] += dp[i]) %= MOD;    for (int i = 0; i < MAXN; i++)    {        int sign = 1;        for (int j = 0; j < MAXM; j++) if ((1 << j) & i) sign = -sign;        (ans += sign * (bin[dp[i]] - 1) % MOD + MOD) %= MOD;    }    printf("%lld\n", ans);    return 0;}

提交记录(AC / Total = 1 / 1):

Run ID Remote Run ID Time(ms) Memory(kb) Result Submit Time 8772053 26348806 373 17508 AC 2017-04-14 08:37:59
0 0
原创粉丝点击