#include <stdio.h>
#include <vector>
#include <set>
#include <unordered_map>
#define MAXN 50
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;

struct Comp {
    bool operator()(vector<long long> a, vector<long long> b) {
        if(a.size() != b.size()) return a.size() < b.size();
        int i;
        for(i = 0; i < (int) a.size() && a[i] == b[i]; i++);
        if(i == (int) a.size()) return 0;
        return a[i] < b[i];
    }
};

int n, a[MAXN];
unordered_map<long long, int> m[MAXN];
unordered_map<long long, int>::iterator it;
set<vector<long long>, Comp> s[MAXN];

long long computeXor(vector<long long> &v) {
    long long ans = 0;
    for(auto x: v)
        ans ^= x;
    return ans;
}

int main() {
    //freopen("in", "r", stdin);

    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);

    int i;
    vector<long long> v;
    v.push_back(a[1]);
    s[1].insert(v);

    for(i = 2; i <= MIN(n, 18); i++) {
        for(auto v: s[i - 1]) {
            v.push_back(a[i]);
            s[i].insert(v);
            v.pop_back();
            v[v.size() - 1] += a[i];
            s[i].insert(v);
        }
    }

    for(int i = 1; i <= MIN(n, 18); i++)
        for(auto v: s[i])
            m[i][computeXor(v)]++;

    if(n <= 18) {
        printf("%d\n", m[n][0]);
        return 0;
    }

    v.clear();
    v.push_back(a[n]);
    s[n].insert(v);

    for(int i = n - 1; i >= 19; i--) {
        for(auto v: s[i + 1]) {
            v.push_back(a[i]);
            s[i].insert(v);
            v.pop_back();
            v[v.size() - 1] += a[i];
            s[i].insert(v);
        }
    }

    for(int i = 19; i <= n; i++)
        for(auto v: s[i])
            m[i][computeXor(v)]++;

    long long sol = 0;
    for(it = m[18].begin(); it != m[18].end(); it++)
        sol += 1LL * (it -> second) * m[19][it -> first];

    for(int i = 18; i >= 1; i--)
        for(int j = 19; j <= n; j++) {
            long long x = 0;
            for(int k = i; k <= j; k++)
                x += a[k];

            if(i == 1 && j == n) {
                sol += (x == 0);
                continue;
            }
            if(i == 1) {
                sol += m[j + 1][x];
                continue;
            }

            if(j == n) {
                sol += m[i - 1][x];
                continue;
            }

            for(it = m[i - 1].begin(); it != m[i - 1].end(); it++)
                sol += 1LL * (it -> second) * m[j + 1][(it -> first) ^ x];
        }

    printf("%lld\n", sol);

    return 0;
}