#include<iostream> #include<cstdio> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #include<cstdlib> #include<sstream> #define sp(z) setprecision(z) #define sv(z) sort(z.begin(),z.end()) #define F first #define S second #define pb push_back #define mp make_pair #define ll long long #define ld long double #define si(z) scanf("%d",&z) #define sl(z) scanf("%Ld",&z) #define sd(z) scanf("%Lf",&z) #define sc(z) scanf("%c",&z) #define fr(y,q,s) for(int y=q;y<s;y++) #define f(y,z) for(int y=0;y<z;y++) #define fe(y,z) for(int y=1;y<=z;y++) using namespace std; ll min(ll a,ll b){ return (a<b)?a:b; } ll max(ll a,ll b){ return (a>b)?a:b; } ll gcd(ll a,ll b){ return (b==0)?a:gcd(b,a%b); } ll modpow(ll a, ll n, ll mod){ ll res=1; while(n){ if(n&1)res=(res*a)%mod; a=(a*a)%mod; n>>=1; } return res; } ll lpow(ll a, ll n){ ll res=1; while(n){ if(n&1)res*=a; a*=a; n>>=1; } return res; } ld dpow(ld a, ll n){ ld res=1; while(n){ if(n&1)res*=a; a*=a; n>>=1; } return res; } //int primes[1000001]; //void sieve(){ f(i,1000001) primes[i]=1;primes[1]=0;for(int i=2;i<=32000;i++) { if(primes[i])for(int j=2;(i*j)<=1000000;j++)primes[i*j]=0; }} const int maxn = 40; int a[maxn]; int n; int sum[maxn][maxn]; int xr[maxn][maxn]; map<pair<int,ll>,ll> dp; ll solve(int id, ll xr) { ll res = 0; pair<int,ll> cur = mp(id,xr); if(dp.find(cur)!=dp.end()) return dp[cur]; if(id>=n) { if(xr) return 0; else return 1; } if(id==(n-1)) { if(xr^a[id]) return 0; else return 1; } for(int i=id;i<n;i++) { ll cursum = 0; for(int j=id;j<=i;j++) cursum+=a[j]; res+=solve(i+1,xr^cursum); } dp[cur]=res; return res; } int main() { si(n); f(i,n) si(a[i]); ll answer = 0; answer = solve(0,0); printf("%lld\n",answer); return 0; }