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.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Dima {
    public static void main(String[] args) {
        FastReader input = new FastReader();
        OutputStream ob = System.out;
        PrintWriter out = new PrintWriter(ob);
        int n = input.nextInt();
        int[] arr = new int[n];
        for(int i = 0;i < n;i++){
            arr[i] = input.nextInt();
        }
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i = 0;i < n;i++){
            int num = arr[i];
            int sum = 0;
            while(true){
                if(num == 0){
                    sum += 0;
                    break;
                }
                else if(num == 1){
                    sum += 1;
                 //   System.out.println("here");
                    break;
                }
                else{
                    if((num % 2) == 0){
                        num /= 2;
                    }
                    else{
                        num /= 2;
                        sum++;
                    }
                }
            }
            if(map.containsKey(sum)){
                map.put(sum,map.get(sum) + 1);
            }
            else{
                map.put(sum,1);
            }
        }
//        for(int i : arr2){
//            System.out.print(i + " ");
//        }
        int pair = 0;
        for(Map.Entry m : map.entrySet()){
            if((Integer)m.getValue() > 1){
                pair += ((Integer)m.getValue() * ((Integer) m.getValue() - 1))/2;
            }
           // System.out.println(m.getKey() + " " + m.getValue());
        }
        System.out.println(pair);
    }
    static class FastReader
    {
        BufferedReader br;
        StringTokenizer st;

        public FastReader()
        {
            br = new BufferedReader(new
                    InputStreamReader(System.in));
        }

        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt()
        {
            return Integer.parseInt(next());
        }

        long nextLong()
        {
            return Long.parseLong(next());
        }

        double nextDouble()
        {
            return Double.parseDouble(next());
        }

        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }
}
