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)); } } }