Problem:
Score : 400 points

Problem Statement

We have N integers. The i-th integer is A_i.

Find \sum_{i=1}^{N-1}\sum_{j=i+1}^{N} (A_i \mbox{ XOR } A_j), modulo (10^9+7).

What is \mbox{ XOR }?

The XOR of integers A and B, A \mbox{ XOR } B, is defined as follows:

When A \mbox{ XOR } B is written in base two, the digit in the 2^k's place (k \geq 0) is 1 if either A or B, but not both, has 1 in the 2^k's place, and 0 otherwise.

For example, 3 \mbox{ XOR } 5 = 6. (In base two: 011 \mbox{ XOR } 101 = 110.)

Constraints

2 \leq N \leq 3 \times 10^5

0 \leq A_i < 2^{60}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the value \sum_{i=1}^{N-1}\sum_{j=i+1}^{N} (A_i \mbox{ XOR } A_j), modulo (10^9+7).

Sample Input 1

3
1 2 3

Sample Output 1

6

We have (1\mbox{ XOR } 2)+(1\mbox{ XOR } 3)+(2\mbox{ XOR } 3)=3+2+1=6.

Sample Input 2

10
3 1 4 1 5 9 2 6 5 3

Sample Output 2

237

Sample Input 3

10
3 14 159 2653 58979 323846 2643383 27950288 419716939 9375105820

Sample Output 3

103715602

Print the sum modulo (10^9+7).

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.*;
import java.io.*;
public class Main
{
    public static void main(String []args) throws IOException {
    	FastScanner in  = new FastScanner(System.in);
    	PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)), false); 
    	solve(in, out);
    	in.close();
    	out.close();
    }
    static long gcd(long a, long b){ return (b==0) ? a : gcd(b, a%b); }
    static int gcd(int a, int b){ return (b==0) ? a : gcd(b, a%b); }
    static class FastScanner{
	BufferedReader reader;
	StringTokenizer st;
	FastScanner(InputStream stream){reader=new BufferedReader(new InputStreamReader(stream));st=null;}	
	String next(){while(st == null || !st.hasMoreTokens()){try{String line = reader.readLine();if(line == null){return null;}		    
	     st = new StringTokenizer(line);}catch (Exception e){throw new RuntimeException();}}return st.nextToken();}
	String nextLine()  {String s=null;try{s=reader.readLine();}catch(IOException e){e.printStackTrace();}return s;}	    	  	
	int    nextInt()   {return Integer.parseInt(next());}
	long   nextLong()  {return Long.parseLong(next());}		
	double nextDouble(){return Double.parseDouble(next());}
	char   nextChar()  {return next().charAt(0);}
	int[]  nextIntArray(int n)         {int[] arr= new int[n];   int i=0;while(i<n){arr[i++]=nextInt();}  return arr;}
	long[] nextLongArray(int n)        {long[]arr= new long[n];  int i=0;while(i<n){arr[i++]=nextLong();} return arr;}	
	int[]  nextIntArrayOneBased(int n) {int[] arr= new int[n+1]; int i=1;while(i<=n){arr[i++]=nextInt();} return arr;}	    	
	long[] nextLongArrayOneBased(int n){long[]arr= new long[n+1];int i=1;while(i<=n){arr[i++]=nextLong();}return arr;}	    	
	void   close(){try{reader.close();}catch(IOException e){e.printStackTrace();}}				
    }
    
    /********* SOLUTION STARTS HERE ************/
    
    private static void solve(FastScanner in, PrintWriter out){
        int mod = (int)(1e9+7);
        int n = in.nextInt();
        int mat1[][] = new int[n][60];
        int mat2[][] = new int[n][60];
        
        int ans[] = new int[61];
        // long a[] = new long[n];
        // for(int i=0;i<n;i++){
        //     a[i] = in.nextLong();
        // }
        long tmp = 0L;
        for(int i=0;i<n;i++){
            tmp = in.nextLong();
            for(int j=0;j<60;j++){
                if(((1L<<j)&tmp)!=0) {mat1[i][j]=1;mat2[i][j]=1;}
            }
        }
        
        
        // for(int i=0;i<n;i++){
        //     for(int j=0;j<60;j++){
        //         out.write(mat1[i][j]+" ");
        //     }
        //     out.write("\n");
        // }
        
        for(int i=n-2;i>=0;i--){
            for(int j=0;j<60;j++){
                mat2[i][j] += mat2[i+1][j];
            }
        }
        // out.write("\n\n");
        
        // for(int i=0;i<n;i++){
        //     for(int j=0;j<60;j++){
        //         out.write(mat2[i][j]+" ");
        //     }
        //     out.write("\n");
        // }
        
        // out.write("\n\n");out.write("\n\n");
        
        for(int i=0;i<n-1;i++){
            for(int j=0;j<60;j++){
                if(mat1[i][j]==0){
                    ans[j] += mat2[i+1][j];
                } else {
                    ans[j] += (n-i-1-mat2[i+1][j]);
                }
            }
        }
        
        
        
        // for(int i=0;i<61;i++) out.write(ans[i]+" ");out.write("\n");
        long pp = 0L;
        for(int i=0;i<61;i++){
            pp += (ans[i]*((1L<<i)%mod))%mod;
            pp%=mod;
        }
        out.write(pp+"\n");
        
        
        // long sum = 0;
        // for(int i=0;i<n-1;i++){
        //     for(int j=i+1;j<n;j++){
        //         sum += (a[i]^a[j])%mod;
        //         sum%=mod;
        //     }
        // }
        // out.write(sum+"\n");
    }
    
    /************* SOLUTION ENDS HERE **********/
}