Contar pares en Array cuyo producto es una K-ésima potencia de cualquier entero positivo

Dada una array arr[] de longitud N y un entero K , la tarea es contar pares en la array cuyo producto es K- ésima potencia de un entero positivo, es decir

A[i] * A[j] = Z K para cualquier entero positivo Z.

Ejemplos:

Entrada: arr[] = {1, 3, 9, 8, 24, 1}, K = 3 

Salida:

Explicación: Hay 5 pares de este tipo, que se pueden representar como Z 3 – A[0] * A[3] = 1 * 8 = 2^3 A[0] * A[5] = 1 * 1 = 1^3 A[1] * A[2] = 3 * 9 = 3^3 A[2] * A[4] = 9 * 24 = 6^3 A[3] * A[5] = 8 * 1 = 2^ 3 

Entrada: arr[] = {7, 4, 10, 9, 2, 8, 8, 7, 3, 7}, K = 2 

Salida:

Explicación: Hay 7 de esos pares, que se pueden representar como Z 2

Enfoque: La observación clave en este problema es para representar cualquier número en la forma de Z K , entonces las potencias de descomposición en factores primos de ese número deben ser múltiplos de K. A continuación se muestra la ilustración de los pasos:

  • Calcule la descomposición en factores primos de cada número de la array y almacene los factores primos en forma de par clave-valor en un mapa hash, donde la clave será un factor primo de ese elemento y el valor será la potencia elevada a ese primo factor módulo K, en la descomposición en factores primos de ese número. 

Por ejemplo:

Given Element be - 360 and K = 2
Prime Factorization = 23 * 32 * 51

Key-value pairs for this would be,
=> {(2, 3 % 2), (3, 2 % 2),
    (5, 1 % 2)}
=> {(2, 1), (5, 1)}

// Notice that prime number 3 
// is ignored because of the 
// modulus value was 0
  • Recorra la array y cree un mapa hash de frecuencia en el que los pares clave-valor se definirían de la siguiente manera:
Key: Prime Factors pairs mod K
Value: Frequency of this Key
  • Finalmente, Traverse para cada elemento de la array y verificar que los factores primos requeridos estén presentes en el mapa hash o no. En caso afirmativo, habrá F número de pares posibles, donde F es la frecuencia. 

Ejemplo:

Given Number be - 360, K = 3
Prime Factorization -
=> {(3, 2), (5, 1)}

Required Prime Factors -
=> {(p1, K - val1), ...(pn, K - valn)}
=> {(3, 3 - 2), (5, 3 - 1)}
=> {(3, 1), (5, 2)}  

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation to count the
// pairs whose product is Kth
// power of some integer Z
 
#include <bits/stdc++.h>
 
#define MAXN 100005
 
using namespace std;
 
// Smallest prime factor
int spf[MAXN];
 
// Sieve of eratosthenes
// for computing primes
void sieve()
{
    int i, j;
    spf[1] = 1;
    for (i = 2; i < MAXN; i++)
        spf[i] = i;
 
    // Loop for markig the factors
    // of prime number as non-prime
    for (i = 2; i < MAXN; i++) {
        if (spf[i] == i) {
            for (j = i * 2;
                 j < MAXN; j += i) {
                if (spf[j] == j)
                    spf[j] = i;
            }
        }
    }
}
 
// Function to factorize the
// number N into its prime factors
vector<pair<int, int> > getFact(int x)
{
    // Prime factors along with powers
    vector<pair<int, int> > factors;
 
    // Loop while the X is not
    // equal to 1
    while (x != 1) {
 
        // Smallest prime
        // factor of x
        int z = spf[x];
        int cnt = 0;
        // Count power of this
        // prime factor in x
        while (x % z == 0)
            cnt++, x /= z;
 
        factors.push_back(
            make_pair(z, cnt));
    }
    return factors;
}
 
// Function to count the pairs
int pairsWithKth(int a[], int n, int k)
{
 
    // Precomputation
    // for factorisation
    sieve();
 
    int answer = 0;
 
    // Data structure for storing
    // list L for each element along
    // with frequency of occurrence
    map<vector<pair<int,
                    int> >,
        int>
        count_of_L;
 
    // Loop to iterate over the
    // elements of the array
    for (int i = 0; i < n; i++) {
 
        // Factorise each element
        vector<pair<int, int> >
            factors = getFact(a[i]);
        sort(factors.begin(),
             factors.end());
 
        vector<pair<int, int> > L;
 
        // Loop to iterate over the
        // factors of the element
        for (auto it : factors) {
            if (it.second % k == 0)
                continue;
            L.push_back(
                make_pair(
                    it.first,
                    it.second % k));
        }
 
        vector<pair<int, int> > Lx;
 
        // Loop to find the required prime
        // factors for each element of array
        for (auto it : L) {
 
            // Represents how much remainder
            // power needs to be added to
            // this primes power so as to make
            // it a multiple of k
            Lx.push_back(
                make_pair(
                    it.first,
                    (k - it.second + k) % k));
        }
 
        // Add occurrences of
        // Lx till now to answer
        answer += count_of_L[Lx];
 
        // Increment the counter for L
        count_of_L[L]++;
    }
 
    return answer;
}
 
// Driver Code
int main()
{
    int n = 6;
    int a[n] = { 1, 3, 9, 8, 24, 1 };
    int k = 3;
 
    cout << pairsWithKth(a, n, k);
    return 0;
}
Producción:

5

Complejidad del tiempo: O(N * log 2 N)

Publicación traducida automáticamente

Artículo escrito por king_tsar 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 *