Cuente pares en una array cuya suma sea divisible por K

Dada una array A[] y un entero positivo K , la tarea es contar el número total de pares en la array cuya suma es divisible por K
Nota: Esta pregunta es una versión generalizada de esta 

Ejemplos: 

Input : A[] = {2, 2, 1, 7, 5, 3}, K = 4
Output : 5
Explanation : 
There are five pairs possible whose sum
is divisible by '4' i.e., (2, 2), 
(1, 7), (7, 5), (1, 3) and (5, 3)

Input : A[] = {5, 9, 36, 74, 52, 31, 42}, K = 3
Output : 7

Enfoque ingenuo : el enfoque más simple es iterar a través de cada par de la array pero usando dos bucles for anidados y contar aquellos pares cuya suma es divisible por ‘K’. La complejidad temporal de este enfoque es O(N 2 ).

Enfoque eficiente : un enfoque eficiente es utilizar la técnica Hashing. Separaremos los elementos en cubos dependiendo de su (valor mod K). Cuando un número se divide por K, el resto puede ser 0, 1, 2, hasta (k-1). Así que tome una array para decir freq[] de tamaño K (inicializado con cero) y aumente el valor de freq[A[i]%K] para que podamos calcular la cantidad de valores que dan el resto j en la división con K.

C++

// C++ Program to count pairs
// whose sum divisible by 'K'
#include <bits/stdc++.h>
using namespace std;
 
// Program to count pairs whose sum divisible
// by 'K'
int countKdivPairs(int A[], int n, int K)
{
    // Create a frequency array to count
    // occurrences of all remainders when
    // divided by K
    int freq[K] = { 0 };
 
    // Count occurrences of all remainders
    for (int i = 0; i < n; i++)
        ++freq[A[i] % K];
 
    // If both pairs are divisible by 'K'
    int sum = freq[0] * (freq[0] - 1) / 2;
 
    // count for all i and (k-i)
    // freq pairs
    for (int i = 1; i <= K / 2 && i != (K - i); i++)
        sum += freq[i] * freq[K - i];
    // If K is even
    if (K % 2 == 0)
        sum += (freq[K / 2] * (freq[K / 2] - 1) / 2);
    return sum;
}
 
// Driver code
int main()
{
 
    int A[] = { 2, 2, 1, 7, 5, 3 };
    int n = sizeof(A) / sizeof(A[0]);
    int K = 4;
    cout << countKdivPairs(A, n, K);
 
    return 0;
}

Java

// Java program to count pairs
// whose sum divisible by 'K'
import java.util.*;
 
class Count {
    public static int countKdivPairs(int A[], int n, int K)
    {
        // Create a frequency array to count
        // occurrences of all remainders when
        // divided by K
        int freq[] = new int[K];
 
        // Count occurrences of all remainders
        for (int i = 0; i < n; i++)
            ++freq[A[i] % K];
 
        // If both pairs are divisible by 'K'
        int sum = freq[0] * (freq[0] - 1) / 2;
 
        // count for all i and (k-i)
        // freq pairs
        for (int i = 1; i <= K / 2 && i != (K - i); i++)
            sum += freq[i] * freq[K - i];
        // If K is even
        if (K % 2 == 0)
            sum += (freq[K / 2] * (freq[K / 2] - 1) / 2);
        return sum;
    }
    public static void main(String[] args)
    {
        int A[] = { 2, 2, 1, 7, 5, 3 };
        int n = 6;
        int K = 4;
        System.out.print(countKdivPairs(A, n, K));
    }
}

Python3

# Python3 code to count pairs whose
# sum is divisible by 'K'
 
# Function to count pairs whose
# sum is divisible by 'K'
def countKdivPairs(A, n, K):
     
    # Create a frequency array to count
    # occurrences of all remainders when
    # divided by K
    freq = [0] * K
     
    # Count occurrences of all remainders
    for i in range(n):
        freq[A[i] % K]+= 1
         
    # If both pairs are divisible by 'K'
    sum = freq[0] * (freq[0] - 1) / 2;
     
    # count for all i and (k-i)
    # freq pairs
    i = 1
    while(i <= K//2 and i != (K - i) ):
        sum += freq[i] * freq[K-i]
        i+= 1
 
    # If K is even
    if( K % 2 == 0 ):
        sum += (freq[K//2] * (freq[K//2]-1)/2);
     
    return int(sum)
 
# Driver code
A = [2, 2, 1, 7, 5, 3]
n = len(A)
K = 4
print(countKdivPairs(A, n, K))

C#

// C# program to count pairs
// whose sum divisible by 'K'
using System;
 
class Count
{
    public static int countKdivPairs(int []A, int n, int K)
    {
        // Create a frequency array to count
        // occurrences of all remainders when
        // divided by K
        int []freq = new int[K];
 
        // Count occurrences of all remainders
        for (int i = 0; i < n; i++)
            ++freq[A[i] % K];
 
        // If both pairs are divisible by 'K'
        int sum = freq[0] * (freq[0] - 1) / 2;
 
        // count for all i and (k-i)
        // freq pairs
        for (int i = 1; i <= K / 2 && i != (K - i); i++)
            sum += freq[i] * freq[K - i];
             
        // If K is even
        if (K % 2 == 0)
            sum += (freq[K / 2] * (freq[K / 2] - 1) / 2);
        return sum;
    }
     
    // Driver code
    static public void Main ()
    {
        int []A = { 2, 2, 1, 7, 5, 3 };
        int n = 6;
        int K = 4;
        Console.WriteLine(countKdivPairs(A, n, K));
    }
}
 
// This code is contributed by akt_mit.

PHP

<?php
// PHP Program to count pairs
// whose sum divisible by 'K'
 
// Program to count pairs whose sum
// divisible by 'K'
function countKdivPairs($A, $n, $K)
{
     
    // Create a frequency array to count
    // occurrences of all remainders when
    // divided by K
    $freq = array_fill(0, $K, 0);
 
    // Count occurrences of all remainders
    for ($i = 0; $i < $n; $i++)
        ++$freq[$A[$i] % $K];
 
    // If both pairs are divisible by 'K'
    $sum = (int)($freq[0] * ($freq[0] - 1) / 2);
 
    // count for all i and (k-i)
    // freq pairs
    for ($i = 1; $i <= $K / 2 &&
                 $i != ($K - $i); $i++)
        $sum += $freq[$i] * $freq[$K - $i];
         
    // If K is even
    if ($K % 2 == 0)
        $sum += (int)($freq[(int)($K / 2)] *
                     ($freq[(int)($K / 2)] - 1) / 2);
    return $sum;
}
 
// Driver code
$A = array( 2, 2, 1, 7, 5, 3 );
$n = count($A);
$K = 4;
echo countKdivPairs($A, $n, $K);
 
// This code is contributed by mits
?>

Javascript

<script>
    // Javascript program to count pairs whose sum divisible by 'K'
     
    function countKdivPairs(A, n, K)
    {
        // Create a frequency array to count
        // occurrences of all remainders when
        // divided by K
        let freq = new Array(K);
        freq.fill(0);
  
        // Count occurrences of all remainders
        for (let i = 0; i < n; i++)
            ++freq[A[i] % K];
  
        // If both pairs are divisible by 'K'
        let sum = freq[0] * parseInt((freq[0] - 1) / 2, 10);
  
        // count for all i and (k-i)
        // freq pairs
        for (let i = 1; i <= K / 2 && i != (K - i); i++)
            sum += freq[i] * freq[K - i];
              
        // If K is even
        if (K % 2 == 0)
            sum += parseInt(freq[parseInt(K / 2, 10)] * (freq[parseInt(K / 2, 10)] - 1) / 2, 10);
        return sum;
    }
     
    let A = [ 2, 2, 1, 7, 5, 3 ];
    let n = 6;
    let K = 4;
    document.write(countKdivPairs(A, n, K));
         
</script>

Producción : 

 5

Complejidad temporal: O(N) 
Espacio auxiliar: O(K), ya que se ha tomado K espacio extra.

https://www.youtube.com/watch?v=5UJvXcSUyT0

Publicación traducida automáticamente

Artículo escrito por Chandan_Agrawal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *