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