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.*;
import java.util.*;


public class B {
	int INF = Integer.MAX_VALUE / 1000;
	static Scanner sc = null;
	int MAX = 200001;
	Map<Integer, Integer> fs = null;
	public void solve() throws Exception{

		int n = sc.nextInt();
		int[] d = new int[n];
		for(int i = 0; i < n; i++){
			d[i]= sc.nextInt();
		}
		Arrays.sort(d);
		int[] f = new int[100001];
		f[0] = 0;
		f[1] = 1;
		f[2] = 1;
		f[3] = 2;
		f[4] = 1;
		f[5] = 2;
		f[6] = 2;
		fs = new HashMap<Integer, Integer>();
		for(int i = 0; i <= 6; i++){
			fs.put(i, f[i]);
		}
		for(int i = 0; i < d.length; i++){
			if(!fs.containsKey(d[i])){
				int num = getf(d[i]);
				fs.put(d[i], num);
			}
		}
	
	
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		for(int i = 0; i < d.length; i++){
			int num = d[i];
			if(map.containsKey(fs.get(num))){
				int cnt = map.get(fs.get(num)) + 1;
				map.put(fs.get(num), cnt);
			}
			else{
				map.put(fs.get(num), 1);
			}
		}
		long ans = 0;
		for(int key : map.keySet()){
			int cnt = map.get(key);
			if(cnt > 1){
				ans += nc(cnt, 2);
			}
		}
		System.out.println(ans);
		
	}
	int nc(int n, int c){
		if(n < c){
			return 0;
		}
		if(n-c < c){
			c = n-c;
		}
		
		long ans = 1;
		int t = c;
		while(t >= 1){
			ans *= n;
			n--;
			t--;
		}
		
		while(c > 1){
			ans /= c;
			c--;
		}
		
		return (int)ans;
	}
	
	int getf(int num){
		if(fs.containsKey(num)){
			return fs.get(num);
		}
		if(num % 2 == 1){
			return getf(num / 2) + 1;
		}
		else{
			return getf(num / 2);
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		File file = new File("input.txt");
		if(file.exists()){
			System.setIn(new BufferedInputStream(new FileInputStream("input.txt")));
		}
		sc =  new Scanner(System.in);
		B t = new B();
		t.solve();

	}
	
	
}
