题目链接:https://codeforces.com/contest/1610/problem/D
分析
所有情况减去不符合要求的情况。
可以发现,一个奇数是必定可以的,因为可以以
0
0
0为中点对称,同理,一些数的和为奇数也是可以满足要求的。
那么我们就不必考虑奇数以及和为奇数的情况。
经过推断可以发现,若两个数的
l
o
w
b
i
t
lowbit
lowbit是不同的,那么他们一定不可以满足要求(例如
{
2
,
4
}
\{2,4\}
{2,4})。两个相同
l
o
w
b
i
t
lowbit
lowbit的数可以加成一个高一位的
l
o
w
b
i
t
lowbit
lowbit,那么如同
{
2
,
2
,
4
}
\{2,2,4\}
{2,2,4}这样的是可以满足要求的。所以可以推出,不行的情况只要最低为的
l
o
w
b
i
t
lowbit
lowbit集合中取出奇数个,其他随意取即可(不考虑
l
o
w
b
i
t
lowbit
lowbit为
1
1
1的)。那么我们只要枚举最低位是哪位算出所有不能的情况减去即可。
具体看代码
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define fi first
#define se second
#define lson (k << 1)
#define rson (k << 1 | 1)
const ll LINF = 1e18;
const int INF = 1e9 + 7;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const ll P = 1e9 + 7;
const double eps = 1e-7;
int n;
int a[N], s[50];
ll qm(ll x, ll y)
{
ll res = 1;
while(y)
{
if(y & 1) res = res * x % P;
x = x * x % P;
y >>= 1;
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int j = 0;
while(!(a[i] & (1 << j))) j++;
s[j]++;
}
ll ans = qm(2, n) - 1;
n -= s[0];
for(int i=1;i<=30;i++)
{
if(s[i] == 0) continue;
ans = (ans - qm(2, s[i] - 1) * qm(2, n - s[i]) % P + P) % P;
n -= s[i];
}
printf("%lld\n", ans);
return 0;
}