geeksforgeeks@ Find sum of different corresponding bits for all pairs (Bit manipulation)

http://www.practice.geeksforgeeks.org/problem-page.php?pid=387

Find sum of different corresponding bits for all pairs

We define f (X, Y) as number of different corresponding bits in binary representation of X and Y. For example, f (2, 7) = 2, since binary representation of 2 and 7 are 010 and 111, respectively. The first and the third bit differ, so f (2, 7) = 2.

You are given an array of N integers, A1, A2 ,…, AN. Find sum of f(Ai, Aj) for all pairs (i, j) such that 1 ≤ i, j ≤ N. Return the answer modulo 109+7.

Input:

The first line of each input consists of the test cases. The description of T test cases is as follows:

The first line of each test case contains the size of the array, and the second line has the elements of the array.


Output:

In each separate line print sum of all pairs for (i, j) such that 1 ≤ i, j ≤ N and return the answer modulo 109+7.


Constraints:

1 ≤ T ≤ 70
1 ≤ N ≤ 100
-2,147,483,648 ≤ A[i] ≤ 2,147,483,647


Example:

Input:

2
2
2 4
3
1 3 5

Output:

4
8

Working:

A = [1, 3, 5] 

We return

f(1, 1) + f(1, 3) + f(1, 5) +
f(3, 1) + f(3, 3) + f(3, 5) +
f(5, 1) + f(5, 3) + f(5, 5) =

0 + 1 + 1 +
1 + 0 + 2 +
1 + 2 + 0 = 8

 

import java.util.*;
import java.lang.*;
import java.io.*;

class GFG {
    
    public static int difBits(int a, int b) {
        
        int tot = 0;
        
        for(int i=0; i<32; ++i) {
            int mask = (1 << i);
            int ai = (a & mask) >> i;
            int bi = (b & mask) >> i;
            
            tot = (ai == bi)? tot: tot+1;
        }
        
        return tot;
    }
    
    public static int func(int[] arr) {
        
        int n = arr.length;
        int rs = 0;
        
        for(int i=0; i<n; ++i) {
            for(int j=i+1; j<n; ++j) {
                rs += difBits(arr[i], arr[j]);
            }
        }
        rs *= 2;
        return rs;
    }
    
    public static void main (String[] args) {
        Scanner in = new Scanner(System.in);
        int times = in.nextInt();
        
        for(int i=0; i<times; ++i) {
            int n = in.nextInt();
            int[] arr = new int[n];
            for(int j=0; j<n; ++j) {
                arr[j] = in.nextInt();
            }
            System.out.println(func(arr));
        }
    }
}
View Code

 

posted @ 2016-07-05 22:19  流白  阅读(410)  评论(0编辑  收藏  举报