#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;
}