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