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


public class B
{
        String line;
        StringTokenizer inputParser;
        BufferedReader is;
        FileInputStream fstream;
        DataInputStream in;
        String FInput="";
        
        void openInput(String file)
        {

                if(file==null)is = new BufferedReader(new InputStreamReader(System.in));//stdin
                else
                {
                        try{
                
                                
                        fstream = new FileInputStream(file);
                        in = new DataInputStream(fstream);
                        is = new BufferedReader(new InputStreamReader(in));
                        }catch(Exception e)
                        {
                                System.err.println(e);
                        }
                }

        }
        
        void readNextLine()
    	{
    		try {
    			line = is.readLine();
    			inputParser = new StringTokenizer(line, " ");
    			//System.err.println("Input: " + line);
    		} catch (IOException e) {
    			System.err.println("Unexpected IO ERROR: " + e);
    		}	
    		catch (NullPointerException e)
    		{
    			line=null;
    			
    		}
    		
    	}
        
        long NextLong()
        {
                String n = inputParser.nextToken();
                
                long val = Long.parseLong(n);
                
                 return val;
        }
        
        int NextInt()
        {
                String n = inputParser.nextToken();
                int val = Integer.parseInt(n);
                
                //System.out.println("I read this number: " + val);
                return val;
        }
        
        String NextString()
        {
                String n = inputParser.nextToken();
                return n;
        }
        
        void closeInput()
        {
                try {
                        is.close();
                } catch (IOException e) {
                        System.err.println("Unexpected IO ERROR: " + e);
                }
                        
        }
        
        
        public static void main(String [] argv)
        {
                //String filePath="input.txt";
        		//String filePath="D:\\_d\\learn\\coursera\\algorithms and design I\\data\\IntegerArray.txt";
                String filePath=null;
                if(argv.length>0)filePath=argv[0];
                new B(filePath);
        }
        
        public void readFInput()
    	{
    		for(;;)
    		{
    			try
    			{
    				readNextLine();
    				FInput+=line+" ";
    			}
    			catch(Exception e)
    			{
    				break;
    			}
    		}
    		inputParser = new StringTokenizer(FInput, " ");
    	}
        
        
        
        public B(String inputFile)
        {
        	openInput(inputFile);
        	
        	readNextLine();
        	int n=NextInt();
        	readNextLine();
        	long []d =new long[1000];
        	for(int i=0; i<n; i++)
        	{
        		
        		d[f(NextInt())]++;
        	}
        	long ret=0;/*
        	for(int i=0; i<n; i++)
        		for(int j=i+1; j<n; j++)
        		{
        			if(d[i]==d[j])ret++;
        		}*/
        	for(int i=0; i<d.length; i++)
        		ret+=d[i]*(d[i]-1)/2L;
        	System.out.println(ret);
        	
            closeInput();		
    	}
        HashMap <Integer, Integer> hm = new HashMap<Integer, Integer>();
        
        private int f(int i) {
			if(i==0)return 0;
			//if(hm.containsKey(i))return hm.get(i);
			if(i%2==0){hm.put(i, f(i/2)); return hm.get(i);}
			hm.put(i, 1+f(i/2)); 
			return hm.get(i);
		}

		public static void out(Object s)
        {
        try{
	        FileWriter fstream = new FileWriter("output.txt");
	        BufferedWriter out = new BufferedWriter(fstream);
	        out.write(s.toString());
	        out.close();
	        }catch (Exception e){
	        	System.err.println("Error: " + e.getMessage());
	        }
        }
               
}