Dima got into number sequences. Now he's got sequence a1, a2, ..., an, consisting of n positive integers. Also, Dima has got a function f(x), which can be defined with the following recurrence:

  * f(0) = 0; 
  * f(2·x) = f(x); 
  * f(2·x + 1) = f(x) + 1. 



Dima wonders, how many pairs of indexes (i, j) (1 ≤ i < j ≤ n) are there, such that f(ai) = f(aj). Help him, count the number of such pairs. 

Input

The first line contains integer n (1 ≤ n ≤ 105). The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 109).

The numbers in the lines are separated by single spaces.

Output

In a single line print the answer to the problem.

Please, don't use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specifier.

Examples

Input

3
1 2 4


Output

3


Input

3
5 3 1


Output

1

Note

In the first sample any pair (i, j) will do, so the answer is 3.

In the second sample only pair (1, 2) will do.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashMap;

public class CFTest17
{

	static BufferedReader br;
	
	
	static HashMap<Integer,Integer>hm;
	public static void main(String[] args) {
		br = new BufferedReader(new InputStreamReader(System.in));
	
		hm=new HashMap<Integer,Integer>();
		HashMap<Integer,Long>hm2=new HashMap<Integer,Long>();
		try {
		
			int n=readInt();
			int[]arr=readIntArr();
			for(int i=0;i<n;i++){
				int val=recur(arr[i]);
				//System.out.println(val);
				Long ii=hm2.get(val);
				if(ii==null){
					hm2.put(val, 1l);
				
				}else{
					hm2.put(val,ii+1);
				}
			}
			long sum=0;
			Collection<Long>c=hm2.values();
			for(long l:c){
				if(l<2)continue;
				long vv=l*(l-1);
				vv/=2;
				sum+=vv;
			}
			
			System.out.println(sum);
			//System.out.println(num);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	
	static int recur(int i){
		Integer ii=hm.get(i);
		if(ii!=null)return ii;
		if(i==0)return 0;
		if(i%2==0){
			return recur(i/2);
		}
		return recur(i-1)+1;
		
	
	}
	
	
	static public String readLine() throws IOException {
		return br.readLine();

	}

	

	static public String readString() throws IOException {
		return br.readLine();

	}

	static public long readlong() throws IOException {
		return Long.parseLong(br.readLine());
	}

	static public int readInt() throws IOException {
		return Integer.parseInt(br.readLine());
	}

	static public int[] readIntArr() throws IOException {
		String[] str = br.readLine().split(" ");
		int arr[] = new int[str.length];
		for (int i = 0; i < arr.length; i++)
			arr[i] = Integer.parseInt(str[i]);
		return arr;
	}

	static public double[] readDoubleArr() throws IOException {
		String[] str = br.readLine().split(" ");
		double arr[] = new double[str.length];
		for (int i = 0; i < arr.length; i++)
			arr[i] = Double.parseDouble(str[i]);
		return arr;
	}

	static public long[] readLongArr() throws IOException {
		String[] str = br.readLine().split(" ");
		long arr[] = new long[str.length];
		for (int i = 0; i < arr.length; i++)
			arr[i] = Long.parseLong(str[i]);
		return arr;
	}

	static public double readDouble() throws IOException {
		return Double.parseDouble(br.readLine());
	}
}
