#include <cstdio> #include <map> using namespace std; int a[50]; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d", &a[i]); } if(n<=20){ int cnt=0; for(int i=0;i<(1<<(n-1));i++){ i|=(1<<n); int xored=0; int prev=-1; int sum=0; for(int j=0;j<=n;j++){ sum+=a[j]; if(i&(1<<j)){ xored^=sum; sum=0; prev=j; } } if(xored==0){cnt++;} i&=~(1<<n); } printf("%d\n",cnt); } else{ #define HALF 18 long long cnt=0; for(int x=HALF;x<n;x++){ // The first division at/after 18th is at xth map<int,int> l,r; // sets containing left and right xor possibilities counts. for(int i=0;i<(1<<(HALF));i++){ int xored=0; int sum=0; int prev=-1; int last1=-1; for(int j=0;j<HALF;j++){ if(i&(1<<j)){ last1=j; } } for(int j=0;j<=last1;j++){ sum+=a[j]; if(i&(1<<j)){ xored^=sum; sum=0; prev=j; } } for(int j=last1+1;j<=x;j++){ sum+=a[j]; } l[xored^sum]++; } if(x!=n-1){ for(int i=0;i<(1<<(n-x-2));i++){ int xored=0; int sum=0; int prev=-1; i|=1<<(n-x-2); for(int j=0;j<=(n-x-2);j++){ sum+=a[x+j+1]; if(i&(1<<j)){ xored^=sum; sum=0; prev=j; } } i&=~(1<<(n-x-2)); r[xored]++; } } else{ r[0]++; } for(map<int,int>::iterator it=l.begin();it!=l.end();it++){ cnt+=(long long)(it->second)*r[it->first]; } } printf("%lld\n",cnt); } }