bb中选出n{n}个数aia_i,这个子序列是好的当且仅当能找到满足如下条件的x{x}

a1(2x1+a11)2+a2(2x2+a21)2+...+an(2xn+an1)2=0{\frac{a_1(2*x_1+a_1-1)}{2}+\frac{a_2(2*x_2+a_2-1)}{2}+...+\frac{a_n(2*x_n+a_n-1)}{2}=0}{xixiZ}{\{x_i|x_i\in \Z\}}

(2x11)a1+(2x21)a2+...+(2xn1)an=a12a22...an2{(2*x_1-1)*a_1+(2*x_2-1)*a_2+...+(2*x_n-1)*a_n=-a_1^2-a_2^2-...-a_n^2}{xixiZ}{\{x_i|x_i\in \Z\}}

x1a1+x2a2+...+xnan=a12a22...an2{x_1*a_1+x_2*a_2+...+x_n*a_n=-a_1^2-a_2^2-...-a_n^2}{xixi%2==1}{\{x_i|x_i\%2==1 \}}

(x1+a1)a1+(x2+a2)a2+...+(xn+an)an=0{(x_1+a_1)*a_1+(x_2+a_2)*a_2+...+(x_n+a_n)*a_n=0}{xixi%2==1}{\{x_i|x_i\%2==1 \}}

x1a1+x2a2+...+xnan=0{x_1*a_1+x_2*a_2+...+x_n*a_n=0}{xiaixixi}{\{x_i|a_i为奇数则x_i为偶数,反之x_i为奇数 \}}

  1. 如果存在多个ai{a_i}为奇数,那么我们取一个奇数的ak{a_k},其它的奇数ai{a_i}对应的xi{x_i}制为0,对每个偶数aj{a_j},我们一定能解得xjxkj(xj<0,xkj>0){x_j、x_{kj}(x_j<0,x_{kj}>0)}使得xjaj+xkjak=0{x_j*a_j+x_{kj}*a_k=0},将所有的xkj{x_{kj}}求和得到xk{x_k}使得等式成立。
  2. 假设这个n{n}个数都是偶数,不断提取公因子2{2},最后为常数为奇数的项有res{res}个。如果res{res}为奇数,将这些项合并成一个项后就是一个奇数,而其它项都是偶数,那么所有项之和一定不为0;反之可以任取res{res}中的两项去抵消其它项。

第2点的例子:

a_1=5 	a_2=9 	a_3=2*3
x_1=3*9 x_2=3*5	x_3=-5*9

a_1=5	  a_2=9 	a_3=2*2*7
x_1=3*7*9 x_2=5*7	x_3=-5*9

a_1=5		  a_2=9 		a_3=2*3 	a_4=2*2*7
x_1=3*9+3*7*9 x_2=3*5+5*7	x_3=-5*9	x_4=-5*9

对每个数按因子2{2}的个数i{i}分类,因子2{2}的个数为i{i}的数有cntcnt个,因子2{2}的个数大于i{i}的数有sum{sum}个,i{i}30{30}i{i}枚举,因子2{2}的个数为i{i}的数选出偶数个,选法有2cnt21{\frac{2^{cnt}}{2}-1}(选出奇数个的方案数=选出偶数个的方案数,选出偶数个的方案包含了空集),然后因子2{2}的个数大于i{i}的每个数可选可不选,选法有种2sum{2^{sum}},总的贡献为(2cnt11)2sum{(2^{cnt-1}-1)*2^{sum}}因子2{2}的个数为1{1}的数是奇数,每个数可选可不选(空集除外),总的贡献为(2cnt1)2sum{(2^{cnt}-1)*2^{sum}}

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=2e5+7,mod=1e9+7;
ll qpow(ll a, ll b) {
	ll ans = 1;
	while (b) {
		if (b & 1)
			ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}
inline void solve() {
	int n;
	cin>>n;
	vector<int>b(32);
	for(int i=1,x; i<=n; ++i) {
		cin>>x;
		int cnt(0);
		while(x%2==0) {
			x/=2;
			++cnt;
		}
		++b[cnt];
	}
	ll ans(0);
	int cc(0);
	for(int i=30; ~i; --i) if(b[i]) {
		if(i) ans+=qpow(2,cc)*(qpow(2,b[i]-1)-1)%mod;
		else ans+=qpow(2,cc)*(qpow(2,b[i])-1)%mod;
		if(ans>=mod) ans-=mod;
		cc+=b[i];
	}
	cout<<ans<<'\n';
}
int main() {
	cin.sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int _=1;
//	cin>>_;
	while(_--) solve();
	return 0;
}