package main

import (
	"bufio"
	"fmt"
	"os"
	"reflect"
	"strconv"
)

var sc = bufio.NewScanner(os.Stdin)
var out = bufio.NewWriter(os.Stdout)

func main() {
	sc.Split(bufio.ScanWords)
	defer out.Flush() // !!!!coution!!!! you must use Fprint(out, ) not Print()
	/* --- code ---*/
	N := nextInt()
	a := nextInts(N)
	x := []int{-1, -1, -1}
	c := []int{0, 0, 0}
	for i := 0; i < N; i++ {
		if x[0] == -1 || x[0] == a[i] {
			x[0] = a[i]
			c[0]++
			continue
		}
		if x[1] == -1 || x[1] == a[i] {
			x[1] = a[i]
			c[1]++
			continue
		}
		if x[2] == -1 || x[2] == a[i] {
			x[2] = a[i]
			c[2]++
			continue
		}
		fmt.Fprint(out, "No\n")
		return
	}
	if x[0] == 0 && x[1] == -1 && x[2] == -1 {
		fmt.Fprint(out, "Yes\n")
		return
	}
	if x[2] == -1 {
		if c[0]*2 == c[1] && x[0] == 0 || c[0] == c[1]*2 && x[1] == 0 {
			fmt.Fprint(out, "Yes\n")
			return
		}
		fmt.Fprint(out, "No\n")
		return
	}
	if c[0] == c[1] && c[1] == c[2] && x[0]^x[1]^x[2] == 0 {
		fmt.Fprint(out, "Yes\n")
	} else {
		fmt.Fprint(out, "No\n")
	}
	// used := make([]int, N)
	// used[0] = 1
	// if solve(N, a, used, 0, 0, a[0], 1) {
	// 	fmt.Fprint(out, "Yes\n")
	// } else {
	// 	fmt.Fprint(out, "No\n")
	// }
}

func solve(N int, a []int, used []int, s2, x1, x2, depth int) bool {
	// fmt.Fprint(out, used, depth, x1, x2, "\n")
	if depth == N {
		// fmt.Fprint(out, "atta\n")
		return x1^x2^a[0] == 0 && x2^a[0]^s2 == 0
	}
	for i := 0; i < N; i++ {
		if used[i] > 0 {
			continue
		}
		if depth >= 2 && x1^x2^a[i] != 0 {
			continue
		}
		used[i] = 1
		if depth == 1 {
			s2 = a[i]
		}
		if solve(N, a, used, s2, x2, a[i], depth+1) {
			return true
		}
		used[i] = 0
	}
	return false
}

func next() string {
	sc.Scan()
	return sc.Text()
}

func nextInt() int {
	a, _ := strconv.Atoi(next())
	return a
}

func nextFloat64() float64 {
	a, _ := strconv.ParseFloat(next(), 64)
	return a
}

func nextInts(n int) []int {
	ret := make([]int, n)
	for i := 0; i < n; i++ {
		ret[i] = nextInt()
	}
	return ret
}
func nextFloats(n int) []float64 {
	ret := make([]float64, n)
	for i := 0; i < n; i++ {
		ret[i] = nextFloat64()
	}
	return ret
}
func nextStrings(n int) []string {
	ret := make([]string, n)
	for i := 0; i < n; i++ {
		ret[i] = next()
	}
	return ret
}

// Genericsがないので筋肉で...
// interfaceでの取扱がようわからんし
func containStr(arr []string, target string) bool {
	for _, v := range arr {
		if v == target {
			return true
		}
	}
	return false
}

func PrintOut(src interface{}, joinner string) {
	switch reflect.TypeOf(src).Kind() {
	case reflect.Slice:
		s := reflect.ValueOf(src)
		for idx := 0; idx < s.Len(); idx++ {
			fmt.Fprintf(out, "%v", s.Index(idx))
			if idx < s.Len()-1 {
				fmt.Fprintf(out, "%s", joinner)
			} else {
				fmt.Fprintln(out)
			}
		}
	default:
		fmt.Fprintln(out, "fuck")
	}
}

// mapからkeysとvaluesを返す感じのやつ
// なんかしらんけどmap[interface{}]interface{}しか受け付けない。なんのためのinterface{}やねん
// なので呼ぶときのmapはmap[int]stringとかじゃダメ
func splitKeyValue(m map[interface{}]interface{}) (keys, values []interface{}) {
	switch reflect.TypeOf(m).Kind() {
	case reflect.Map:
		s := reflect.ValueOf(m)
		for _, v := range s.MapKeys() {
			keys = append(keys, v)
			values = append(values, s.MapIndex(v))
		}
	default:
		fmt.Fprintln(out, "fuck")
	}
	return
}


Measured memory_bytes: 2432