给定整数数组“ 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