应用了线性基的性质。
一个基可以表示向量空间里任意一个数。
所以任意求一组基,计算每一个基之外的数的贡献,就是这个数必选,其他数可选可不选
基之内的数,如果这个基不可被替代,那么贡献为0,否则贡献与基之外的数一样。
#include <bits/stdc++.h>
using namespace std;
#define N 300005
#define pii pair<int,int>
#define go(i,a,b) for(int i=(a);i<=(b);i++)
#define dep(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
#define mid (l+r)/2
#define ls i*2+1
#define rs i*2+2
#define lson l,mid,ls
#define rson mid+1,r,rs
#define root 1,n+1,0
#define inf 0x3f3f3f3f
#define ll long long
#define M 63
#define mod 1000000007
ll data[N],b[70],c[70];
int f[N],pos[N],r,n;
inline ll cal(ll b[],ll x){
dep(j,M,0)if(x>>j&1){
if(!b[j])return b[j]=x;
x^=b[j];
}
return 0;
}
ll qpow(ll a,ll b,ll res=1){for(;b>0;b/=2)res=res*((b&1)?a:1)%mod,a=a*a%mod;return res;}
int main()
{
while(scanf("%d",&n)!=EOF){
memset(b,0,sizeof b);r=0;
go(i,1,n){
scanf("%lld",&data[i]);
f[i]=0; if(cal(b,data[i]))pos[++r]=i,f[i]=1 ;
}
ll ans=1ll*(n-r)*qpow(2,n-r-1)%mod;
memset(b,0,sizeof b);
go(i,1,n)if(!f[i])cal(b,data[i]);
go(i,1,r){
memcpy(c,b,sizeof b);
go(j,1,r)if(i!=j)cal(c,data[pos[j]]);
if(!cal(c,data[pos[i]])) ans=(ans+qpow(2,n-r-1))%mod;
}
printf("%lld\n",ans);
}
}