/*********************************************************************\ |--\ --- /\ |-----------| ----- /-------| | | \ | / \ | | / | | \ | / \ | | | | | \ | / \ | | |----| | | \ | / ------ \ |-------| | |-----| | | \ | / \ | | | | | \ | / \ | | / | --- ------- ------ ----- |---------/ | | codeforces = nfssdq || topcoder = nafis007 | mail = nafis_sadique@yahoo.com || nfssdq@gmail.com | IIT,Jahangirnagar University(41) | | **********************************************************************/ #include <bits/stdc++.h> using namespace std; #define xx first #define yy second #define pb push_back #define mp make_pair #define LL long long #define inf INT_MAX/3 #define mod 1000000007ll #define PI acos(-1.0) #define linf (1ll<<60)-1 #define FOR(I,A,B) for(int I = (A); I < (B); ++I) #define REP(I,N) FOR(I,0,N) #define ALL(A) ((A).begin(), (A).end()) #define set0(ar) memset(ar,0,sizeof ar) #define vsort(v) sort(v.begin(),v.end()) #define setinf(ar) memset(ar,126,sizeof ar) //cout << fixed << setprecision(20) << p << endl; template <class T> inline T bigmod(T p,T e,T M){ LL ret = 1; for(; e > 0; e >>= 1){ if(e & 1) ret = (ret * p) % M; p = (p * p) % M; } return (T)ret; } template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);} template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);} LL ar[19][1<<19], ar1[1<<19], val[39], cc[19], ss[39]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; REP(i, n) cin >> val[i]; REP(i, n) { ss[i] = val[i]; if(i) ss[i] += ss[i-1]; } if(n == 1){ cout << 1 << endl; return 0; } int p = n / 2; REP(i, 1<<p){ int xor_val = 0, sum = 0, last = 0; if(i % 2 == 0) continue; REP(j, p){ if(i & 1<<j){ xor_val ^= sum; sum = 0; last = j; } sum += val[j]; } ar[last][cc[last]++] = xor_val; } REP(i, p) sort(ar[i], ar[i] + cc[i]); LL res = 0; int q = n - p; REP(i, 1<<q){ int xor_val = 0, sum = 0, sum1 = 0, fl = 0; REP(j, q){ if(i & 1<<j){ if(fl == 0) sum1 = sum; else xor_val ^= sum; sum = 0; fl = 1; } sum += val[j+p]; } if(fl == 0) sum1 = sum; else xor_val ^= sum; REP(j, p){ LL sumt = sum1 + ss[p-1]; if(j > 0) sumt -= ss[j-1]; int tv = xor_val ^ sumt; LL cnt = upper_bound(ar[j], ar[j] + cc[j], tv) - lower_bound(ar[j], ar[j] + cc[j], tv); // cout << i << " " << j << " " << tv << " " << cnt << endl; res += cnt; } } cout << res << endl; }