// spnauT
//
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int _b=(b),i=(a); i<_b; ++i)
#define ROF(i,b,a) for(int _a=(a),i=(b); i>_a; --i)
#define REP(n) for(int _n=(n); --_n>=0;)
#define _1 first
#define _2 second
#define PB(x) push_back(x)
#define SZ(x) int((x).size())
#define ALL(x) (x).begin(), (x).end()
#define MSET(m,v) memset(m,v,sizeof(m))
#define MAX_PQ(T) priority_queue <T>
#define MIN_PQ(T) priority_queue <T,vector<T>,greater<T>>
#define IO() {ios_base::sync_with_stdio(0); cin.tie(0);}
#define nl '\n'
#define cint1(a) int a; cin>>a
#define cint2(a,b) int a,b; cin>>a>>b
#define cint3(a,b,c) int a,b,c; cin>>a>>b>>c
typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> VI; typedef vector<LL> VL; typedef vector<PII> VP;
template<class A, class B> inline bool mina(A &x, B y) {return(y<x)?(x=y,1):0;}
template<class A, class B> inline bool maxa(A &x, B y) {return(x<y)?(x=y,1):0;}
template<class A, class B> inline A geta(A &x, const B y) {A t=x;x=y;return t;}



#define MAXN (40)
#define MAXM (19)

typedef pair<LL,int> PLI;

int A[MAXN];
int A2[MAXN];

PLI B[MAXM][1<<MAXM];
int bn[MAXM];
PLI C[MAXM][1<<MAXM];
int cn[MAXM];
unordered_map<LL,int> CM[MAXM];

inline LL getCM(int id, LL x)
{
	auto m = CM[id].find(x);
	if(m != CM[id].end()) return m->_2;
	else return 0;
}

void calc(PLI B[MAXM][1<<MAXM], int *bn, int n)
{
//	printf("calc %d\n", n);
	assert(n <= 18);
	B[0][0] = PLI(0,1);
	B[1][0] = PLI(A2[0],1);
	bn[0] = bn[1] = 1;

	FOR(l,2,n+1)
	{
		FOR(b,0,1<<(l-1))
		{
			LL xsum = 0;
			LL sum = A2[0];
			FOR(i,0,l-1)
			{
				if(b & (1 << i))
				{
					xsum ^= sum;
					sum = 0;
				}
				sum += A2[i+1];
			}

			xsum ^= sum;
			B[l][bn[l]++] = PLI(xsum,1);
		}
		sort(B[l],B[l]+bn[l]);

/*
		printf("l %d  %d : ", l, bn[l]);
		FOR(i,0,bn[l]) printf(" %lld", B[l][i]._1);
		putchar(nl);
*/

		int j = 0;
		FOR(i,1,bn[l])
		{
			if(B[l][j]._1 == B[l][i]._1) ++B[l][j]._2;
			else B[l][++j] = B[l][i];
		}
		bn[l] = j+1;

/*
		printf("l %d  %d : ", l, bn[l]);
		FOR(i,0,bn[l]) printf(" (%lld,%d)", B[l][i]._1, B[l][i]._2);
		putchar(nl);
*/
	}
}

int main()
{
	IO();
	int N;
	cin >> N;
	FOR(i,0,N) cin >> A[i];

	if(N <= 10)
	{
		int sol = 0;
		FOR(b,0,1<<(N-1))
		{
			LL xsum = 0;
			LL sum = A[0];
			FOR(i,0,N-1)
			{
				if(b & (1 << i))
				{
					xsum ^= sum;
					sum = 0;
				}
				sum += A[i+1];
			}

			xsum ^= sum;
			sol += xsum == 0;
		}
		cout << sol << nl;
	}
	else
	{
		int bn1 = N/2;
		FOR(i,0,bn1) A2[i] = A[i];
		calc(B, bn, bn1);

		int cn1 = 0;
		ROF(i,N-1,bn1-1) A2[cn1++] = A[i];
		calc(C, cn, cn1);

		FOR(i,0,cn1+1) FOR(j,0,cn[i]) CM[i][C[i][j]._1] = C[i][j]._2;

		LL sol = 0;
		FOR(bl,0,bn1+1) FOR(cl,0,cn1+1)
		{
			if((bl == bn1) ^ (cl == cn1)) continue;
			LL tg = 0;
			FOR(i,bl,bn1) tg += A[i];
			FOR(i,cl,cn1) tg += A2[i];

			FOR(i,0,bn[bl])
			{
				LL res = getCM(cl, B[bl][i]._1 ^ tg);
				sol += B[bl][i]._2 * res;
			}
		}
		cout << sol << nl;
	}

	return 0;
}