There are some beautiful girls in Arpa’s land as mentioned before.

Once Arpa came up with an obvious problem:

Given an array and a number x, count the number of pairs of indices i, j (1 ≤ i < j ≤ n) such that <image>, where <image> is bitwise xor operation (see notes for explanation).

<image>

Immediately, Mehrdad discovered a terrible solution that nobody trusted. Now Arpa needs your help to implement the solution to that problem.

Input

First line contains two integers n and x (1 ≤ n ≤ 105, 0 ≤ x ≤ 105) — the number of elements in the array and the integer x.

Second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105) — the elements of the array.

Output

Print a single integer: the answer to the problem.

Examples

Input

2 3
1 2


Output

1

Input

6 1
5 1 2 3 4 1


Output

2

Note

In the first sample there is only one pair of i = 1 and j = 2. <image> so the answer is 1.

In the second sample the only two pairs are i = 3, j = 4 (since <image>) and i = 1, j = 5 (since <image>).

A bitwise xor takes two bit integers of equal length and performs the logical xor operation on each pair of corresponding bits. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1. You can read more about bitwise xor operation here: <https://en.wikipedia.org/wiki/Bitwise_operation#XOR>.

/*
 * Author- Priyam Vora
 * BTech 2nd Year DAIICT
 */

        
import java.io.*;
import java.math.*;
import java.util.*;
import javax.print.attribute.SetOfIntegerSyntax;

public class Graph1 {
	private static InputStream stream;
	private static byte[] buf = new byte[1024];
	private static int curChar;
	private static int numChars;
	private static SpaceCharFilter filter;
	private static PrintWriter pw;
	private static long count = 0,mod=1000000007;
	private static TreeSet<Integer>ts[]=new TreeSet[200000];
	private static HashSet hs=new HashSet();

	public static void main(String args[]) throws Exception {
		InputReader(System.in);
		pw = new PrintWriter(System.out);
		//ans();
		soln();
		pw.close();
	}
	//----------------------------------------My Code------------------------------------------------//

	private static void soln() {

		int n=nextInt();
		int x=nextInt();
		int a[]=nextIntArray(n);
		int freq[]=new int[100001];
		for(int i=0;i<n;i++){
			freq[a[i]]++;
		}
		long c=0;
		for(int i=0;i<n;i++){
			if((a[i]^x)<=100000 && freq[(a[i]^x)]>0){
			c+=freq[(a[i]^x)];
			if(x==0){
				c--;
				
			}
			freq[a[i]]--;
			
				}
		}
		pw.println(c);
		
	}
			//----------------------------------------THE END----------------------------------------------------------//        	

	static class Pair implements Comparable<Pair>{

		int idx,val;
		Pair(int idx,int val){
			this.idx=idx;
			this.val=val;
		}
		@Override
		public int compareTo(Pair o) {
			// TODO Auto-generated method stub
		//	Sort in increasing order

		
			if(o.idx<idx){
				return 1;
			}
			if(o.idx==idx && o.val<val){
				return 1;
			}else{
				return -1;
			}
			
		}
		
	}

	public static long gcd(long x, long y) {
		if (x % y == 0)
			return y;
		else
			return gcd(y, x % y);
	}
	
	private static int BinarySearch(int a[], int low, int high, int target) {
		if (low > high)
			return -1;
		int mid = low + (high - low) / 2;
		if (a[mid] == target)
			return mid;
		if (a[mid] > target)
			high = mid - 1;
		if (a[mid] < target)
			low = mid + 1;
		return BinarySearch(a, low, high, target);
	}
	
	public static String reverseString(String s) {
		StringBuilder sb = new StringBuilder(s);
		sb.reverse();
		return (sb.toString());
	}
	
	private static int GetRightPosition(int A[], int l, int r, int key) {
		int m;

		while (r - l > 1) {
			m = l + (r - l) / 2;

			if (A[m] <= key)
				l = m;
			else
				r = m;
		}

		return l;
	}

	private static int GetLeftPosition(int A[], int l, int r, int key) {
		int m;

		while (r - l > 1) {
			m = l + (r - l) / 2;

			if (A[m] >= key)
				r = m;
			else
				l = m;
		}

		return r;
	}

	private static int CountOccurances(int A[], int size, int key) {
		// Observe boundary conditions
		int left = GetLeftPosition(A, -1, size - 1, key);
		int right = GetRightPosition(A, 0, size, key);

		// What if the element doesn't exists in the array?
		// The checks helps to trace that element exists
		return (A[left] == key && key == A[right]) ? (right - left + 1) : 0;
	}

	private static int Ceil(int a[], int low, int high, int target) {
		if (target <= a[low]) {
			return a[low];

		}
		if (target > a[high])
			return -1;
		while (high - low > 1) {
			int mid = low + (high - low) / 2;
			if (a[mid] < target) {
				low = mid;
				if (mid + 1 <= a.length - 1 && a[mid + 1] >= target)
					return mid + 1;
			}
			if (a[mid] >= target) {
				high = mid;
				if (mid - 1 >= 0 && a[mid - 1] < target) {
					return mid;
				}
			}
		}
		return -1;
	}

	private static int floor(int a[], int low, int high, int target) {
		if (target < a[low]) {
			return -1;
		}
		if (target >= a[high])
			return a[high];
		while (high - low > 1) {
			int mid = low + (high - low) / 2;
			if (a[mid] > target) {
				high = mid;
				if (mid - 1 >= 0 && a[mid - 1] <= target) {
					return mid - 1;
				}
			}
			if (a[mid] <= target) {
				low = mid;
				if ((mid + 1) <= a.length - 1 && a[mid + 1] > target) {
					return mid;
				}
			}

		}
		return -1;
	}

	
	
	public static long pow(long n, long p, long m) {
		long result = 1;
		if (p == 0)
			return 1;
		if (p == 1)
			return n;
		while (p != 0) {
			if (p % 2 == 1)
				result *= n;
			if (result >= m)
				result %= m;
			p >>= 1;
			n *= n;
			if (n >= m)
				n %= m;
		}
		return result;
	}

	public static long pow(long n, long p) {
		long result = 1;
		if (p == 0)
			return 1;
		if (p == 1)
			return n;
		while (p != 0) {
			if (p % 2 == 1)
				result *= n;
			p >>= 1;
			n *= n;
		}
		return result;

	}
	

	public static int[] radixSort(int[] f) {
		int[] to = new int[f.length];
		{
			int[] b = new int[65537];
			for (int i = 0; i < f.length; i++)
				b[1 + (f[i] & 0xffff)]++;
			for (int i = 1; i <= 65536; i++)
				b[i] += b[i - 1];
			for (int i = 0; i < f.length; i++)
				to[b[f[i] & 0xffff]++] = f[i];
			int[] d = f;
			f = to;
			to = d;
		}
		{
			int[] b = new int[65537];
			for (int i = 0; i < f.length; i++)
				b[1 + (f[i] >>> 16)]++;
			for (int i = 1; i <= 65536; i++)
				b[i] += b[i - 1];
			for (int i = 0; i < f.length; i++)
				to[b[f[i] >>> 16]++] = f[i];
			int[] d = f;
			f = to;
			to = d;
		}
		return f;
	}

	public static int nextPowerOf2(final int a) {
		int b = 1;
		while (b < a) {
			b = b << 1;
		}
		return b;
	}

	public static boolean PointInTriangle(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
		int s = p2 * p5 - p1 * p6 + (p6 - p2) * p7 + (p1 - p5) * p8;
		int t = p1 * p4 - p2 * p3 + (p2 - p4) * p7 + (p3 - p1) * p8;

		if ((s < 0) != (t < 0))
			return false;

		int A = -p4 * p5 + p2 * (p5 - p3) + p1 * (p4 - p6) + p3 * p6;
		if (A < 0.0) {
			s = -s;
			t = -t;
			A = -A;
		}
		return s > 0 && t > 0 && (s + t) <= A;
	}

	public static float area(int x1, int y1, int x2, int y2, int x3, int y3) {
		return (float) Math.abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
	}

	public static boolean isPrime(int n) {
		// Corner cases
		if (n <= 1)
			return false;
		if (n <= 3)
			return true;

		// This is checked so that we can skip 
		// middle five numbers in below loop
		if (n % 2 == 0 || n % 3 == 0)
			return false;

		for (int i = 5; i * i <= n; i = i + 6)
			if (n % i == 0 || n % (i + 2) == 0)
				return false;

		return true;
	}

	//merge Sort

	static long sort(int a[])
	{  int n=a.length;
		int b[]=new int[n];	
		return mergeSort(a,b,0,n-1);}
	static long mergeSort(int a[],int b[],long left,long right)
	{ long c=0;if(left<right)
	 {   long mid=left+(right-left)/2;
		 c= mergeSort(a,b,left,mid);
		 c+=mergeSort(a,b,mid+1,right);
		 c+=merge(a,b,left,mid+1,right); }	
		return c;	 }
	static long merge(int a[],int  b[],long left,long mid,long right)
	{long c=0;int i=(int)left;int j=(int)mid; int k=(int)left;
	while(i<=(int)mid-1&&j<=(int)right)
	{ if(a[i]>a[j]) {b[k++]=a[i++]; }
	else	{ b[k++]=a[j++];c+=mid-i;}}
	while (i <= (int)mid - 1)   b[k++] = a[i++]; 
	while (j <= (int)right) b[k++] = a[j++];
	for (i=(int)left; i <= (int)right; i++) 
		a[i] = b[i];  return c;  }
	public static boolean isSubSequence(String large, String small, int largeLen, int smallLen) {
		//base cases
		if (largeLen == 0)
			return false;
		if (smallLen == 0)
			return true;
		// If last characters of two strings are matching
		if (large.charAt(largeLen - 1) == small.charAt(smallLen - 1))
			isSubSequence(large, small, largeLen - 1, smallLen - 1);
		// If last characters are not matching
		return isSubSequence(large, small, largeLen - 1, smallLen);
	}

	// To Get Input
	// Some Buffer Methods

	public static void InputReader(InputStream stream1) {
		stream = stream1;
	}

	private static boolean isWhitespace(int c) {
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	}

	private static boolean isEndOfLine(int c) {
		return c == '\n' || c == '\r' || c == -1;
	}

	private static int read() {
		if (numChars == -1)
			throw new InputMismatchException();
		if (curChar >= numChars) {
			curChar = 0;
			try {
				numChars = stream.read(buf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (numChars <= 0)
				return -1;
		}
		return buf[curChar++];
	}

	private static int nextInt() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	private static long nextLong() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		long res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	private static String nextToken() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isSpaceChar(c));
		return res.toString();
	}

	private static String nextLine() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuilder res = new StringBuilder();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isEndOfLine(c));
		return res.toString();
	}

	private static int[] nextIntArray(int n) {
		int[] arr = new int[n];
		for (int i = 0; i < n; i++) {
			arr[i] = nextInt();
		}
		return arr;
	}

	private static int[][] next2dArray(int n, int m) {
		int[][] arr = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr[i][j] = nextInt();
			}
		}
		return arr;
	}

	private static long[] nextLongArray(int n) {
		long[] arr = new long[n];
		for (int i = 0; i < n; i++) {
			arr[i] = nextLong();
		}
		return arr;
	}

	private static void pArray(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			pw.print(arr[i] + " ");
		}
		pw.println();
		return;
	}

	private static void pArray(long[] arr) {
		for (int i = 0; i < arr.length; i++) {
			pw.print(arr[i] + " ");
		}
		pw.println();
		return;
	}

	private static void pArray(boolean[] arr) {
		for (int i = 0; i < arr.length; i++) {
			pw.print(arr[i] + " ");
		}
		pw.println();
		return;
	}

	private static boolean isSpaceChar(int c) {
		if (filter != null)
			return filter.isSpaceChar(c);
		return isWhitespace(c);
	}

	private interface SpaceCharFilter {
		public boolean isSpaceChar(int ch);
	}

	private static void multiply(int a[][], int b[][]) {
		// Creating an auxiliary matrix to store elements 
		// of the multiplication matrix
		int mul[][] = new int[2][2];
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 2; j++) {
				mul[i][j] = 0;
				for (int k = 0; k < 2; k++)
					mul[i][j] += a[i][k] * b[k][j];
			}
		}

		// storing the muliplication resul in a[][]
		for (int i = 0; i < 2; i++)
			for (int j = 0; j < 2; j++)
				a[i][j] = mul[i][j]; // Updating our matrix
	}

	// Function to compute F raise to power n-2.
	private static int power(int F[][], long n) {
		int M[][] = { { 1, 1 }, { 1, 0 } };

		// Multiply it with initial values i.e with
		// F(0) = 0, F(1) = 1, F(2) = 1
		if (n == 1)
			return F[0][0] + F[0][1];

		power(F, n / 2);

		multiply(F, F);

		if (n % 2 != 0)
			multiply(F, M);

		// Multiply it with initial values i.e with
		// F(0) = 0, F(1) = 1, F(2) = 1
		return F[0][0] + F[0][1];
	}

	// Return n'th term of a series defined using below
	// recurrence relation.
	// f(n) is defined as
	//			         	    f(n) = f(n-1) + f(n-2) + f(n-3), n>=3
	// Base Cases :
	//			         	    f(0) = 0, f(1) = 1, f(2) = 1
	private static long findNthTerm(long n) {

		int F[][] = { { 1, 1 }, { 1, 0 } };

		return power(F, n - 2);
	}

}
   
    class MyComp implements Comparator<Integer>{

		@Override
		public int compare(Integer o1, Integer o2) {
			if(o1<o2){
				return 1;
			}else if(o1>o2){
				return -1;
			}
			return 0;
		}

		
    	
    }
    class Graph{
    	private long conse=0,co=0,mac_cons_cat=0;
    	private int V,flag=1, d[], road_cond[][];
    	private Stack <Integer>st=new Stack();
    	private LinkedList<Integer > adj[];
    	private HashMap<String ,Integer> hs =new HashMap<>();
    //	boolean Visited[];
Graph(int V){
	V++;

	
	//this.mac_cons_cat=max_cat;
this.V=(V);
adj=new LinkedList[V];
//for(int i=0;i<V;i++)
	//adj[i]=new LinkedList();

	
//Visited=new boolean[V];
 
}
void addEdge(int v,int w,int t){
	if(adj[v]==null){
		adj[v]=new LinkedList();
	}
	adj[v].add(w);
	String temp="";
temp+=v;
temp+=w;
//System.out.println(temp+"---");
	if(!hs.containsKey(temp))
	hs.put(temp, t);

}
public long  bfs(int s)
{
	co=0;
    // Mark all the vertices as not visited(By default
// set as false)
        boolean visited[] = new boolean[V];
 
        // Create a queue for BFS
        LinkedList<Integer> queue = new LinkedList<Integer>();
 
        // Mark the current node as visited and enqueue it
        visited[s]=true;
        queue.add(s);
 
        while (queue.size() != 0)
        {
            // Dequeue a vertex from queue and print it
    s = queue.poll();
   // System.out.print(s+" ");
 
            // Get all adjacent vertices of the dequeued vertex s
    // If a adjacent has not been visited, then mark it
    // visited and enqueue it
        Iterator<Integer> i = adj[s].listIterator();
        while (i.hasNext())
        {
            int n = i.next();
            if (!visited[n])
            {
                visited[n] = true;
                queue.add(n);
            co++;
            }
        }
        return co;
    }
    return 0;
}
 public long  dfs(int startVertex){
	
	boolean Visited[]=new boolean[V];
	
	//flag=1;
	
	 if(!Visited[startVertex])  {
		
		 co=0; 
		 dfsUtil(startVertex,Visited);
	 
	 }
	 
	 return co;
 }
 public void Connected(int v){
	 Iterator<Integer> i = adj[v].listIterator();
	 while(i.hasNext()){
		 int n=i.next();
		 long data=(long)d[n]+(long)d[v];
		 data=data%1000000007;
		 d[n]=(int)data;
	 }
 }
 public int getByte(int v){
	 return d[v];
 }
private void dfsUtil(int startVertex, boolean[] Visited) {
	//System.out.println(pre+" "+startVertex);

Visited[startVertex]=true;


st.push(startVertex);
while(!st.isEmpty()){
	int top=st.pop();
	System.out.print(top+" ");
	
	//System.out.println(top);
Iterator<Integer> i=adj[top].listIterator();

while(i.hasNext()){
	int n=i.next();
//	System.out.println(n+"---");
			 if( !Visited[n]){
				Visited[n]=true;
					st.push(n);
					co++;
					}
			 }
		
	}
		}
}

class Dsu{
	private int rank[], parent[] ,n;
	
	Dsu(int size){
		this.n=size+1;
		rank=new int[n];
		parent=new int[n];
	makeSet();
	}
	
	void makeSet(){
		for(int i=0;i<n;i++){
			parent[i]=i;
		}
	}
	
	int find(int x){
		if(parent[x]!=x){
			
			parent[x]=find(parent[x]);
		}
		return parent[x];
	}	
	
	void union(int x,int y){
		int xRoot=find(x);
		int yRoot=find(y);
		
		if(xRoot==yRoot)
			return;
		if(rank[xRoot]<rank[yRoot]){
		parent[xRoot]=yRoot;	
		}else if(rank[yRoot]<rank[xRoot]){
			parent[yRoot]=xRoot;
		}else{
			parent[yRoot]=xRoot;
			rank[xRoot]++;
		}
		
	}

}
class Heap{
	
	public static void build_max_heap(int []a,int size){
		
		for(int i=size/2;i>0;i--){
			min_heapify(a, i);
		}
		for(int i=1;i<a.length;i++){
			System.out.print(a[i]+" ");
		}
	}
	private static void max_heapify(int[] a,int i,int size){
		int left_child=2*i;
		int right_child=(2*i+1);
		int largest=0;
		
		if(left_child<size && a[left_child]>a[i]){
			largest=left_child;
		}else{
			largest=i;
		}
		
		if(right_child<size && a[right_child]>a[largest]){
			largest=right_child;
		}
		if(largest!=i){
			int temp=a[largest];
			a[largest]=a[i];
			a[i]=temp;
			max_heapify(a, largest,size);
		}
	}
	private static void min_heapify(int[] a,int i){
		int left_child=2*i;
		int right_child=(2*i+1);
		int largest=0;
		
		if(left_child<a.length && a[left_child]<a[i]){
			largest=left_child;
		}else{
			largest=i;
		}
		
		if(right_child<a.length && a[right_child]<a[largest]){
			largest=right_child;
		}
		if(largest!=i){
			int temp=a[largest];
			a[largest]=a[i];
			a[i]=temp;
			min_heapify(a, largest);
		}
	}
	public static void extract_max(int size,int a[]){
		if(a.length>1){
			int max=a[1];
			a[1]=a[a.length-1];
			size--;
			max_heapify(a, 1,a.length-1);
		}
	}
}

