#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
using QWORD = uint64_t;
using SQWORD = int64_t;
using DWORD = uint32_t;
using SDWORD = int32_t;
using WORD = uint16_t;
using SWORD = int16_t;
using BYTE = uint8_t;
using SBYTE = int8_t;
using DOUBLE = double;
using FLOAT = float;
static inline QWORD MAX(QWORD a, QWORD b) { return a > b ? a : b; }
static inline DWORD MAX(DWORD a, DWORD b) { return a > b ? a : b; }
static inline SDWORD MAX(SDWORD a, SDWORD b) { return a > b ? a : b; }
static inline QWORD MIN(QWORD a, QWORD b) { return a < b ? a : b; }
static inline DWORD MIN(DWORD a, DWORD b) { return a < b ? a : b; }
static inline SDWORD MIN(SDWORD a, SDWORD b) { return a < b ? a : b; }
using M_BOOL = bool;
static inline void inputStringSpSeparated(char *pcStr) {
  char *pcCur = pcStr;
  for (;;) {
    char c = getchar();
    if (('\n' == c) || (EOF == c) || (' ' == c)) {
      break;
    }
    *pcCur = c;
    pcCur++;
  }
  *pcCur = '\0';
}
static inline void inputString(char *pcStr) {
  char *pcCur = pcStr;
  for (;;) {
    char c = getchar();
    if (('\n' == c) || (EOF == c)) {
      break;
    }
    *pcCur = c;
    pcCur++;
  }
  *pcCur = '\0';
}
static inline SQWORD inputSQWORD(void) {
  SQWORD sqNumber = 0;
  SQWORD sqMultiplier = 1;
  M_BOOL bRead = (false);
  for (;;) {
    char c = getchar();
    if (!bRead) {
      if ('-' == c) {
        sqMultiplier = -1;
      }
    }
    if (('0' <= c) && (c <= '9')) {
      sqNumber *= 10LL;
      sqNumber += (SQWORD)(c - '0');
      bRead = (true);
    } else {
      if (bRead) {
        return sqNumber * sqMultiplier;
      }
    }
  }
}
static inline SDWORD inputSDWORD(void) {
  SDWORD lNumber = 0;
  SDWORD lMultiplier = 1;
  M_BOOL bRead = (false);
  for (;;) {
    char c = getchar();
    if (!bRead) {
      if ('-' == c) {
        lMultiplier = -1;
      }
    }
    if (('0' <= c) && (c <= '9')) {
      lNumber *= 10;
      lNumber += (c - '0');
      bRead = (true);
    } else {
      if (bRead) {
        return lNumber * lMultiplier;
      }
    }
  }
}
static inline DOUBLE inputFP(void) {
  DOUBLE dInt = 0.0;
  DOUBLE dFrac = 0.0;
  DOUBLE dMultiplier = 1.0;
  DWORD dwFpCnt = 0;
  DOUBLE *pdCur = &dInt;
  M_BOOL bRead = (false);
  for (;;) {
    char c = getchar();
    if (!bRead) {
      if ('-' == c) {
        dMultiplier = -1;
      }
    }
    if ('.' == c) {
      pdCur = &dFrac;
    } else if (('0' <= c) && (c <= '9')) {
      (*pdCur) *= 10;
      (*pdCur) += (DOUBLE)(c - '0');
      bRead = (true);
      if (pdCur == &dFrac) {
        dwFpCnt++;
      }
    } else {
      if (bRead) {
        return dMultiplier *
               (dInt + dFrac / (pow((DOUBLE)10.0, (DOUBLE)dwFpCnt)));
      }
    }
  }
}
static SQWORD addMod(SQWORD x, SQWORD y) { return (x + y) % (1000000007LL); }
static SQWORD subMod(SQWORD x, SQWORD y) {
  return (x - y + (1000000007LL)) % (1000000007LL);
}
static SQWORD mulMod(SQWORD x, SQWORD y) { return (x * y) % (1000000007LL); }
static SQWORD powMod(SQWORD x, SQWORD e) {
  SQWORD v = 1;
  for (; e; x = mulMod(x, x), e >>= 1) {
    if (e & 1) {
      v = mulMod(v, x);
    }
  }
  return v;
}
static SQWORD divMod(SQWORD x, SQWORD y) {
  return mulMod(x, powMod(y, (1000000007LL) - 2));
}
static SQWORD combMod(SQWORD n, SQWORD k) {
  SQWORD v = 1;
  for (SQWORD i = 1; i <= k; i++) {
    v = divMod(mulMod(v, n - i + 1), i);
  }
  return v;
}
int main(void) {
  SQWORD sqInput_N = inputSQWORD();
  set<SQWORD> setVals;
  for (SQWORD sqIdx = 0; sqIdx < sqInput_N; sqIdx++) {
    SQWORD sqInput_a = inputSQWORD();
    setVals.insert(sqInput_a);
  }
  if (3 == setVals.size()) {
    SQWORD sqTtl = 0;
    for (auto val : setVals) {
      sqTtl ^= val;
    }
    if (0 == sqTtl) {
      printf("Yes\n");
    } else {
      printf("No\n");
    }
  } else {
    printf("No\n");
  }
  return 0;
}
