#include <iostream> #include <climits> #include <vector> #include <unordered_map> using namespace std; typedef long long int Z; int A[40]; int B[40]; int S[40]; unordered_map<int, int> X[20]; unordered_map<int, int> Y[20]; void laske(int* P, int n, unordered_map<int, int>* out) { S[0] = 0; for(int i = 0; i <= n; ++i) { S[i + 1] = S[i] + P[i]; } out[0][0] = 1; for(int i = 1; i <= n; ++i) { for(int j = 0; j < i; ++j) { for(auto p : out[j]) { out[i][p.first ^ (S[i] - S[j])] += p.second; } } } } int main() { cin.sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; int M = N / 2; for(int i = 0; i < N; ++i) { cin >> A[i]; B[N - 1 - i] = A[i]; } laske(A, M, X); laske(B, N - M, Y); S[0] = 0; for(int i = 0; i < N; ++i) { S[i + 1] = S[i] + A[i]; } Z ret = 0; for(int i = 0; i <= M; ++i) { for(int j = M + 1; j <= N; ++j) { int s = S[j] - S[i]; for(auto p : X[i]) { auto it = Y[N - j].find(s ^ p.first); if(it != Y[N - j].end()) { ret += (Z)p.second * (Z)it->second; } } } } cout << ret << '\n'; return 0; }