#pragma comment (linker, "/STACK:1280000000") #define _CRT_SECURE_NO_WARNINGS //#include "testlib.h" #include <cstdio> #include <cassert> #include <algorithm> #include <iostream> #include <memory.h> #include <string> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <deque> #include <unordered_map> #include <unordered_set> #include <ctime> #include <stack> #include <queue> #include <fstream> #include <sstream> using namespace std; //#define FILENAME "" #define mp make_pair #define all(a) a.begin(), a.end() typedef long long li; typedef long double ld; void solve(); void precalc(); clock_t start; //int timer = 1; int testNumber = 1; bool todo = true; int main() { #ifdef room111 freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #else //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); //freopen(FILENAME".in", "r", stdin); //freopen(FILENAME ".out", "w", stdout); #endif start = clock(); int t = 1; cout.sync_with_stdio(0); cin.tie(0); precalc(); cout.precision(10); cout << fixed; //cin >> t; int testNum = 1; while (t--) { //cout << "Case #" << testNum++ << ": "; solve(); ++testNumber; //++timer; } #ifdef room111 cerr << "\n\n" << (clock() - start) / 1.0 / CLOCKS_PER_SEC << "\n\n"; #endif return 0; } //BE CAREFUL: IS INT REALLY INT? //#define int li /*int pr[] = { 97, 2011 }; int mods[] = { 1000000007, 1000000009 }; const int C = 100500; int powers[2][C];*/ //int MOD = 1000000007; //int c[5010][5010]; //int catalan[200500]; //ld doubleC[100][100]; int binpow(int q, int w, int mod) { if (!w) return 1 % mod; if (w & 1) return q * 1LL * binpow(q, w - 1, mod) % mod; return binpow(q * 1LL * q % mod, w / 2, mod); } /*int curMod = 1000000009; int fact[100500], revfact[100500]; int getC(int n, int k) { int res = fact[n] * revfact[n - k] % curMod * revfact[k] % curMod; return res; }*/ void precalc() { /*fact[0] = revfact[0] = 1; for (int i = 1; i < 100500; ++i) { fact[i] = fact[i - 1] * i % curMod; revfact[i] = binpow(fact[i], curMod - 2, curMod); }*/ /*for (int w = 0; w < 2; ++w) { powers[w][0] = 1; for (int j = 1; j < C; ++j) { powers[w][j] = (powers[w][j - 1] * 1LL * pr[w]) % mods[w]; } }*/ /*catalan[0] = 1; for (int n = 0; n < 200500 - 1; ++n) { catalan[n + 1] = catalan[n] * 2 * (2 * n + 1) % MOD * binpow(n + 2, MOD - 2, MOD) % MOD; }*/ /*for (int i = 0; i < 5010; ++i) { c[i][i] = c[i][0] = 1; for (int j = 1; j < i; ++j) { c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD; } }*/ /*for (int i = 0; i < 100; ++i) { doubleC[i][i] = doubleC[i][0] = 1.0; for (int j = 1; j < i; ++j) { doubleC[i][j] = doubleC[i - 1][j - 1] + doubleC[i - 1][j]; } }*/ } int gcd(int q, int w) { while (w) { q %= w; swap(q, w); } return q; } //#define int li //int mod = 1000000007; void solve() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } if (n == 1) { cout << "1\n"; return; } int sizes[2]; sizes[0] = (n + 1) / 2; sizes[0] = min(sizes[0], 17); sizes[1] = n - 1 - sizes[0]; vector<map<int, int>> results[2]; vector<int> sums[2]; for (int w = 0; w < 2; ++w) { results[w].resize(sizes[w] + 1); sums[w].resize(sizes[w] + 1); } { int w = 0; int start = 0; for (int mask = 0; mask < (1 << sizes[w]); ++mask) { int curSum = 0; int xxor = 0; int last = 0; for (int i = 0; i < sizes[w]; ++i) { int pos = i + start; curSum += a[pos]; if (mask & (1 << i)) { xxor ^= curSum; curSum = 0; last = i + 1; } } sums[w][last] = curSum; results[w][last][xxor]++; } } { int w = 1; int start = n - 1; for (int mask = 0; mask < (1 << sizes[w]); ++mask) { int curSum = 0; int xxor = 0; int last = sizes[1]; for (int i = 0; i < sizes[w]; ++i) { int pos = start - i; curSum += a[pos]; if (mask & (1 << i)) { xxor ^= curSum; curSum = 0; last = pos - sizes[0] - 1; } } curSum += a[sizes[0]]; sums[w][last] = curSum; results[w][last][xxor]++; } } li ans = 0; for (int last = 0; last < results[0].size(); ++last) { for (auto item : results[0][last]) { for (int prev = 0; prev < results[1].size(); ++prev) { if (results[1][prev].empty()) { continue; } int curSum = sums[0][last] + sums[1][prev]; int curxxor = item.first ^ curSum; if (results[1][prev].count(curxxor)) { ans += item.second * 1LL * results[1][prev][curxxor]; } } } } cout << ans << "\n"; }