#include <bits/stdc++.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <cstdio>
using namespace std;

template <class T> using V = vector<T>;
template <class S, class T> using P = pair<S, T>;
template <class... T> using TP = tuple<T...>;

using ll = long long;
using db = double;
using ldb = long db;
using str = string;
using ch = char;
using vll = V<ll>;
using vvll = V<V<ll>>;
using vvvll = V<V<V<ll>>>;
using pll = P<ll,ll>;
using tpll = TP<ll,ll,ll>;
using vpll =V<pll>;
using vvpll = V<vpll>;
using vtpll = V<tpll>;
using vst = V<str>;
using vch = V<ch>;
using vvch = V<vch>;
using qll = queue<ll>;
using vqll = V<qll>;

#define FOR(i,a,b) for(ll i=(a);i<(ll)(b);i++)
#define rFOR(i,a,b) for(ll i=(b);i>(ll)(a);i--)
#define oFOR(i,a,b) for(ll i=(a);i<(ll)(b);i+=2)
#define bgn begin() 
#define en end()
#define SORT(a) sort((a).bgn,(a).en)
#define REV(a) reverse((a).bgn,(a).en)
#define fi first
#define se second
#define sz size()
#define gcd(a,b) __gcd(a,b)
#define co(a) cout<<a<<endl
#define pb(a) push_back(a)
#define pob pop_back()
#define mp make_pair
#define mt make_tuple
#define pbmp(a,b) push_back(mp(a,b))
#define subs(a,b) substr(a,b)
#define cfs(a) cout<<fixed<<setprecision(a) //
/*vvll v(n,vll(m)) n行m列  continue
A.erase(A.begin()+i); 配列Aのi番目を消せる
std::binary_search(v.bgn,v.en,a); 二分探索
abs(a,b)   pow(a,n)  to_string  stoll
auto Iter=lower_bound(v.bgn,v.en,a); v[i]>=aとなる初のv[i]
v.insert(lower_bound(v.bgn,v.en,a),b); bを入れられる
lower upper  co(*Iter) co(Iter-v.bgn) v[i]>=aとなる初のi
vvll v(100001,vll(0)); v[a].pb(b); v[b].pb(a);
priority_queue<ll> pque; pque.push(ai); pque.top()→max(ai) 
vqll q(3);  q[0].push(0); q[0].push(2); q[0].push(1);
q[0].front()→0 q[0].back()→1 q[0].pop(); q[0].front()→2
que.pop() que.sz while(!que.empty())
ll a=1,b=2,c=4,xo; xo=a^b^c; if(a^b^c==0)co(xo)→7 if(xo==0)co(xo)→なし
*/

const int MAX = 510000;
const int MOD = 1000000007;
long long fac[MAX], finv[MAX], inv[MAX];
void Comuse() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}
#define comuse Comuse()
ll combi(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
ll pow_mod(ll a,ll n,ll mod){
  ll res=1;
  for(;n>0;n/=2){
    if(n%2==1)res=(res*a)%mod;
    a=(a*a)%mod;
  }
  return res;
}
ll digit_sum(ll n) {
  ll m=0;
  FOR(i,0,20){
    m+=n%10;
    n/=10;
    if(n==0)break;
  }
  return m;
}
ll lcm(ll a,ll b){
  ll n;
  n=a/gcd(a,b)*b;
  return n;
}

int main(){
  ll n;
  cin>>n;
  vll v(n);
  FOR(i,0,n){
    cin>>v[i];
  }
  vvll d(4,vll(2));
  vll c(10);
  bool b=false,bo=true;
  FOR(i,0,4){
    d[i][0]=-1;
  }
  FOR(i,0,n){
    if(d[0][0]!=v[i]&&c[0]==0){
      d[0][0]=v[i];
      c[0]++;
      d[0][1]++;
    }
    else if(d[0][0]==v[i]){
      d[0][1]++;
    }
    else if(d[1][0]!=v[i]&&c[0]==1){
      d[1][0]=v[i];
      c[0]++;
      d[1][1]++;
    }
    else if(d[1][0]==v[i]){
      d[1][1]++;
    }
    else if(d[2][0]!=v[i]&&c[0]==2){
      d[2][0]=v[i];
      c[0]++;
      d[2][1]++;
    }
    else if(d[2][0]==v[i]){
      d[2][1]++;
    }
    else if(d[0][0]!=v[i]&&c[0]==3){
      bo=false;
      break;
    }
  }
  if(c[0]==1){
    if(d[0][0]==0){
      b=true;
    }
  }
  if(c[0]==2){
    if(n%3==0){
    if(d[0][0]==0||d[1][0]==0){
      if((d[0][1]==n/3&&d[1][1]==n/3*2)||(d[0][1]==n/3*2&&d[1][1]==n/3)){
        b=true;
        //co(2);
      }
    }
    }
  }
  if(c[0]==3){
    if(d[0][1]==n/3&&d[1][1]==n/3&&d[2][1]==n/3){
      ll xo=d[0][0]^d[1][0]^d[2][0];
      if(xo==0){
        b=true;
      }
    }
  }
  if(b&&bo){
    co("Yes");
  }
  else{
    co("No");
  }
  /*co(c[0]);
  FOR(i,0,4){
    co(d[i][0]<<" "<<d[i][1]);
  }*/
  /*ll x,y,z,w;
  x=1,y=2,z=4;
  w=x^y^z;
  if(w==0){
  //w=x^y^z;
  co(w);
  }*/
}


Measured memory_bytes: 1024