📜  给定数组中所有对的按位与之和

📅  最后修改于: 2021-04-23 16:33:19             🧑  作者: Mango

给定整数数组“ arr [0..n-1]”,请计算给定i 例子 :

Input:  arr[] = {5, 10, 15}
Output: 15
Required Value = (5 & 10) + (5 & 15) + (10 & 15) 
               = 0 + 5 + 10 
               = 15

Input: arr[] = {1, 2, 3, 4}
Output: 3
Required Value = (1 & 2) + (1 & 3) + (1 & 4) + 
                 (2 & 3) + (2 & 4) + (3 & 4) 
               = 0 + 1 + 0 + 2 + 0 + 0
               = 3

蛮力方法是运行两个循环,时间复杂度为O(n 2 )。

C++
// A Simple C++ program to compute sum of bitwise AND
// of all pairs
#include 
using namespace std;
 
// Returns value of "arr[0] & arr[1] + arr[0] & arr[2] +
// ... arr[i] & arr[j] + ..... arr[n-2] & arr[n-1]"
int pairAndSum(int arr[], int n)
{
    int ans = 0;  // Initialize result
 
    // Consider all pairs (arr[i], arr[j) such that
    // i < j
    for (int i = 0; i < n; i++)
        for (int j = i+1; j < n; j++)
           ans += arr[i] & arr[j];
 
    return ans;
}
 
// Driver program to test above function
int main()
{
    int arr[] = {5, 10, 15};
    int n = sizeof(arr) / sizeof (arr[0]);
    cout << pairAndSum(arr, n) << endl;
    return 0;
}


Java
// A Simple Java program to compute
// sum of bitwise AND of all pairs
import java.io.*;
 
class GFG {
     
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int arr[], int n)
    {
        int ans = 0; // Initialize result
     
        // Consider all pairs (arr[i], arr[j)
        // such that i < j
        for (int i = 0; i < n; i++)
            for (int j = i+1; j < n; j++)
            ans += arr[i] & arr[j];
     
        return ans;
    }
     
    // Driver program to test above function
    public static void main(String args[])
    {
        int arr[] = {5, 10, 15};
        int n = arr.length;
        System.out.println(pairAndSum(arr, n) );
    }
}
 
/*This code is contributed by Nikita Tiwari.*/


Python3
# A Simple Python 3 program to compute
# sum of bitwise AND of all pairs
 
# Returns value of "arr[0] & arr[1] +
# arr[0] & arr[2] + ... arr[i] & arr[j] +
# ..... arr[n-2] & arr[n-1]"
def pairAndSum(arr, n) :
    ans = 0 # Initialize result
 
    # Consider all pairs (arr[i], arr[j)
    # such that i < j
    for i in range(0,n) :
        for j in range((i+1),n) :
            ans = ans + arr[i] & arr[j]
 
    return ans
 
# Driver program to test above function
arr = [5, 10, 15]
n = len(arr)
print(pairAndSum(arr, n))
 
# This code is contributed by Nikita Tiwari.


C#
// A Simple C# program to compute
// sum of bitwise AND of all pairs
using System;
 
class GFG {
      
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int []arr, int n)
    {
 
        int ans = 0; // Initialize result
      
        // Consider all pairs (arr[i], arr[j)
        // such that i < j
        for (int i = 0; i < n; i++)
            for (int j = i+1; j < n; j++)
                ans += arr[i] & arr[j];
      
        return ans;
    }
      
    // Driver program to test above function
    public static void Main()
    {
        int []arr = {5, 10, 15};
        int n = arr.Length;
        Console.Write(pairAndSum(arr, n) );
    }
}
  
// This code is contributed by nitin mittal.


PHP


Javascript


C
// An efficient C++ program to compute sum of bitwise AND
// of all pairs
#include 
using namespace std;
 
// Returns value of "arr[0] & arr[1] + arr[0] & arr[2] +
// ... arr[i] & arr[j] + ..... arr[n-2] & arr[n-1]"
int pairAndSum(int arr[], int n)
{
    int ans = 0;  // Initialize result
 
    // Traverse over all bits
    for (int i = 0; i < 32; i++)
    {
        // Count number of elements with i'th bit set
        int k = 0;  // Initialize the count
        for (int j = 0; j < n; j++)
            if ( (arr[j] & (1 << i)) )
                k++;
 
        // There are k set bits, means k(k-1)/2 pairs.
        // Every pair adds 2^i to the answer. Therefore,
        // we add "2^i * [k*(k-1)/2]" to the answer.
        ans += (1<


Java
// An efficient Java program to compute
// sum of bitwise AND of all pairs
import java.io.*;
 
class GFG {
     
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int arr[], int n)
    {
        int ans = 0; // Initialize result
     
        // Traverse over all bits
        for (int i = 0; i < 32; i++)
        {
            // Count number of elements with i'th bit set
            // Initialize the count
            int k = 0;
            for (int j = 0; j < n; j++)
            {
                if ((arr[j] & (1 << i))!=0)
                    k++;
            }
     
            // There are k set bits, means k(k-1)/2 pairs.
            // Every pair adds 2^i to the answer. Therefore,
            // we add "2^i * [k*(k-1)/2]" to the answer.
            ans += (1 << i) * (k * (k - 1)/2);
        }
        return ans;
    }
 
    // Driver program to test above function
    public static void main(String args[])
    {
        int arr[] = {5, 10, 15};
        int n = arr.length;
        System.out.println(pairAndSum(arr, n));
    }
}
 
/*This code is contributed by Nikita Tiwari.*/


Python3
# An efficient Python 3 program to
# compute sum of bitwise AND of all pairs
 
# Returns value of "arr[0] & arr[1] +
# arr[0] & arr[2] + ... arr[i] & arr[j] +
# ..... arr[n-2] & arr[n-1]"
def pairAndSum(arr, n) :
    ans = 0 # Initialize result
 
    # Traverse over all bits
    for i in range(0,32) :
         
        # Count number of elements with i'th bit set
        # Initialize the count
        k = 0
        for j in range(0,n) :
            if ( (arr[j] & (1 << i)) ) :
                k = k + 1
 
        # There are k set bits, means k(k-1)/2 pairs.
        # Every pair adds 2^i to the answer. Therefore,
        # we add "2^i * [k*(k-1)/2]" to the answer.
        ans = ans + (1 << i) * (k * (k - 1) // 2)
     
    return ans
     
# Driver program to test above function
arr = [5, 10, 15]
n = len(arr)
print(pairAndSum(arr, n))
 
# This code is contributed by Nikita Tiwari.


C#
// An efficient C# program to compute
// sum of bitwise AND of all pairs
using System;
 
class GFG {
     
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int []arr, int n)
    {
        int ans = 0; // Initialize result
     
        // Traverse over all bits
        for (int i = 0; i < 32; i++)
        {
            // Count number of elements with
            // i'th bit set Initialize the count
            int k = 0;
            for (int j = 0; j < n; j++)
            {
                if ((arr[j] & (1 << i))!=0)
                    k++;
            }
     
            // There are k set bits, means
            // k(k-1)/2 pairs. Every pair
            // adds 2^i to the answer.
            // Therefore, we add "2^i *
            // [k*(k-1)/2]" to the answer.
            ans += (1 << i) * (k * (k - 1)/2);
        }
         
        return ans;
    }
 
    // Driver program to test above function
    public static void Main()
    {
        int []arr = new int[]{5, 10, 15};
        int n = arr.Length;
         
        Console.Write(pairAndSum(arr, n));
    }
}
 
/* This code is contributed by smitha*/


PHP


Javascript


输出 :

15

一个有效的解决方案可以在O(n)时间内解决此问题。这里的假设是整数使用32位表示。
这个想法是要对每个第i个位置(i> = 0 && i <= 31)的设置位数进行计数。如果两个数字中的对应位等于1,则两个数字的AND的第i位为1。
令k为第i个位置的设置位数。第i个置位的对的总数为k C 2 = k *(k-1)/ 2(计数k表示有第k个置位的k个数)。每对这样的总和就加2 i 。同样,我们在所有其他地方工作,并将总和添加到最终答案中。
这个想法与此类似。下面是实现。

C

// An efficient C++ program to compute sum of bitwise AND
// of all pairs
#include 
using namespace std;
 
// Returns value of "arr[0] & arr[1] + arr[0] & arr[2] +
// ... arr[i] & arr[j] + ..... arr[n-2] & arr[n-1]"
int pairAndSum(int arr[], int n)
{
    int ans = 0;  // Initialize result
 
    // Traverse over all bits
    for (int i = 0; i < 32; i++)
    {
        // Count number of elements with i'th bit set
        int k = 0;  // Initialize the count
        for (int j = 0; j < n; j++)
            if ( (arr[j] & (1 << i)) )
                k++;
 
        // There are k set bits, means k(k-1)/2 pairs.
        // Every pair adds 2^i to the answer. Therefore,
        // we add "2^i * [k*(k-1)/2]" to the answer.
        ans += (1<

Java

// An efficient Java program to compute
// sum of bitwise AND of all pairs
import java.io.*;
 
class GFG {
     
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int arr[], int n)
    {
        int ans = 0; // Initialize result
     
        // Traverse over all bits
        for (int i = 0; i < 32; i++)
        {
            // Count number of elements with i'th bit set
            // Initialize the count
            int k = 0;
            for (int j = 0; j < n; j++)
            {
                if ((arr[j] & (1 << i))!=0)
                    k++;
            }
     
            // There are k set bits, means k(k-1)/2 pairs.
            // Every pair adds 2^i to the answer. Therefore,
            // we add "2^i * [k*(k-1)/2]" to the answer.
            ans += (1 << i) * (k * (k - 1)/2);
        }
        return ans;
    }
 
    // Driver program to test above function
    public static void main(String args[])
    {
        int arr[] = {5, 10, 15};
        int n = arr.length;
        System.out.println(pairAndSum(arr, n));
    }
}
 
/*This code is contributed by Nikita Tiwari.*/

Python3

# An efficient Python 3 program to
# compute sum of bitwise AND of all pairs
 
# Returns value of "arr[0] & arr[1] +
# arr[0] & arr[2] + ... arr[i] & arr[j] +
# ..... arr[n-2] & arr[n-1]"
def pairAndSum(arr, n) :
    ans = 0 # Initialize result
 
    # Traverse over all bits
    for i in range(0,32) :
         
        # Count number of elements with i'th bit set
        # Initialize the count
        k = 0
        for j in range(0,n) :
            if ( (arr[j] & (1 << i)) ) :
                k = k + 1
 
        # There are k set bits, means k(k-1)/2 pairs.
        # Every pair adds 2^i to the answer. Therefore,
        # we add "2^i * [k*(k-1)/2]" to the answer.
        ans = ans + (1 << i) * (k * (k - 1) // 2)
     
    return ans
     
# Driver program to test above function
arr = [5, 10, 15]
n = len(arr)
print(pairAndSum(arr, n))
 
# This code is contributed by Nikita Tiwari.

C#

// An efficient C# program to compute
// sum of bitwise AND of all pairs
using System;
 
class GFG {
     
    // Returns value of "arr[0] & arr[1] +
    // arr[0] & arr[2] + ... arr[i] & arr[j] +
    // ..... arr[n-2] & arr[n-1]"
    static int pairAndSum(int []arr, int n)
    {
        int ans = 0; // Initialize result
     
        // Traverse over all bits
        for (int i = 0; i < 32; i++)
        {
            // Count number of elements with
            // i'th bit set Initialize the count
            int k = 0;
            for (int j = 0; j < n; j++)
            {
                if ((arr[j] & (1 << i))!=0)
                    k++;
            }
     
            // There are k set bits, means
            // k(k-1)/2 pairs. Every pair
            // adds 2^i to the answer.
            // Therefore, we add "2^i *
            // [k*(k-1)/2]" to the answer.
            ans += (1 << i) * (k * (k - 1)/2);
        }
         
        return ans;
    }
 
    // Driver program to test above function
    public static void Main()
    {
        int []arr = new int[]{5, 10, 15};
        int n = arr.Length;
         
        Console.Write(pairAndSum(arr, n));
    }
}
 
/* This code is contributed by smitha*/

的PHP


Java脚本


输出:

15