#include <iostream> #include <cstdlib> #include <map> #include <vector> #include <set> #include <unordered_map> #include <cstring> using namespace std; typedef vector<int> vi; typedef long long ll; typedef pair<int, ll> T; int n, a[40]; ll sum[40][40]; int xorr[40][40]; map<T, ll> memo; // How many ways from [i..n-1] can we play to xor to goal? ll f(int i, ll goal) { //printf("f(%d,%lld)\n", i, goal); if (memo.count(T(i,goal))) return memo[T(i,goal)]; ll ans = 0; if (sum[i][n-1] == goal) ans++; for (int k = i+1; k < n; k++) { //cout << " -- " << k << ": " << sum[i][k-1] << endl; ans += f(k, goal^sum[i][k-1]); } //printf("f(%d,%lld)=%lld\n", i, goal, ans); memo[T(i,goal)] = ans; return ans; } int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { ll tmp = 0; for (int k = i; k <= j; k++) tmp += a[k]; sum[i][j] = tmp; //printf("sum[%d][%d] = %lld\n", i,j,sum[i][j]); int tmp2 = 0; //printf("(%d,%d)\n", i, j); for (int k = i; k <= j; k++) { //cout << k << " " << a[k] << endl; tmp2 = (tmp2^a[k]); } xorr[i][j] = tmp2; //printf("xorr[%d][%d] = %d\n", i,j,xorr[i][j]); //printf("\n"); } } ll ans = f(0, 0); cout << ans << endl; //cout << xorr[1][n-1] << endl; //cout << (1^2) << endl; return 0; }