#include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; int go[39], gop = 1; vector<int>can1[39]; vector<int>can2[39]; void gen1(vector<int>&a, int n) { int mid = n / 2; if (n % 2) mid++; for (int i = 0; i < (1 << (mid - 1)); i++) { int curx = 0, sum = a[1]; int tmp = i; for (int j = 2; j <= mid; j++) { if (tmp % 2 == 0) { curx ^= sum; sum = a[j]; } else { sum += a[j]; } tmp /= 2; } can1[mid].push_back(curx^sum); for (int j = mid + 1; j <= n; j++) { sum += a[j]; can1[j].push_back(curx^sum); } } } void gen2(vector<int>&a, int n) { int mid = n / 2; if (n % 2) mid++; for (int len = 1; len <= mid; len++) { for (int i = 0; i < (1 << (len - 1)); i++) { int curx = 0, sum = a[0]; int tmp = i; for (int j = 2; j <= len; j++) { if (tmp % 2 == 0) { curx ^= sum; sum = a[j - 1]; } else { sum += a[j - 1]; } tmp /= 2; } can1[len].push_back(curx^sum); } } } int get(int pos, int val) { return upper_bound(can2[pos].begin(), can2[pos].end(), val) - lower_bound(can2[pos].begin(), can2[pos].end(), val); } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int n; scanf("%d", &n); vector<int>a(n + 1); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } bool mag = false; if (n % 2 == 0) { mag = true; n++; a.push_back(0); } gen1(a, n); for (int i = 1; i <= n; i++) { can2[i] = can1[i]; sort(can2[i].begin(), can2[i].end()); } reverse(a.begin(), a.end()); gen2(a, n); reverse(can1 + 1, can1 + 1 + n); for (int i = 1; i <= n; i++) { sort(can1[i].begin(), can1[i].end()); } long long ans = get(n, 0); for (int i = n; i >= 1;i--) { for (int j = 0; j < can1[i].size(); j++) { ans += get(i - 1, can1[i][j]); } } if (mag) ans /= 2; printf("%lld\n", ans); }