CodeForces 449D Jzzhu and Numbers
题目描述:
输入 N 个数,求这些数有多少个子集按位与之和等于 0 。
题解:
利用容斥原理,令
dpi
表示按位与之和至少有
i
个二进制位等于
1
的方案数,则:
Ans=∑i(−1)idpi
考虑所有的二进制下含有 i 个 1 的数 xi,1,xi,2… ,显然有 dpi=∑j(2fxi,j−1) ,其中 fx 表示在二进制意义下有多少数“包含” x ,可以通过 DP 来求。
代码:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define MAXN 1000007
#define MAXM 25
const 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 |