Saltar al contenido

Genere una matriz de longitud N con GCD de todos sus pares presentes en una matriz 2D dada

Genere una matriz de longitud N con GCD de todos sus pares presentes en una matriz 2D dada

Dada una matriz 2D arr[][] que consiste en N * N enteros positivos, la tarea es generar una matriz de longitud N para que los mayores divisores comunes (MCD) de todos los pares posibles de esa matriz estén en la matriz arr[][].

Ejemplos:

Entrada: N = 4, arr[] = {2, 1, 2, 3, 4, 3, 2, 6, 1, 1, 2, 2, 1, 2, 3, 2}
Producción: 4, 3, 6, 2
Explicación:
Mirando la matriz A[] como {4, 3, 6, 2} entonces el GCD de todos los pares posibles de esta matriz se da a continuación, que es la matriz dada arr[].
{{4, 1, 2, 2},
{1, 3, 3, 1},
{2, 3, 6, 2},
{2, 1, 2, 2}}

Entrada: N = 1, tapete = {100}
Producción: 100

Acercarse: El problema anterior se puede resolver por el hecho de que el MCD del elemento más grande en la matriz original es por sí mismo el más grande en la matriz.[] y después de eliminar los pares de gcd con ese elemento, se puede encontrar el siguiente elemento. Para resolver el problema dado, siga los pasos a continuación:

  • Inicializar una tarjeta, digamos metro Guarde la frecuencia de negación del elemento de matriz en el mapa metro.
  • Inicializar una variable, digamos Artículo cómo (N – 1).
  • Bueno, para todos los elementos de la matriz arr[] encuentra el elemento máximo.
  • Cruzar el mapa METRO.
  • Para cada elemento de la matriz original, busque el elemento con el máximo Frecuencia y guárdelo en el ans.
  • Encontrar y[pos] y quitarle cualquier GCD Pos. + 1 para N-1 de y.
  • Actualizar Artículo cómo pos-1.
  • Repita los pasos anteriores para encontrar todos los elementos de la matriz original.
  • Finalmente, imprima el y.

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

C ++

#include <bits/stdc++.h>

using namespace std;

int n;

 

int gcd(int a, int b)

{

    return b == 0 ? a : gcd(b, a % b);

}

 

void restoreArray(vector<int> mat)

{

    map<int, int> cnt;

 

    

    vector<int> ans(n);

 

    for (int i = 0; i < (n * n); ++i) {

 

        

        

        cnt[-mat[i]]++;

    }

 

    int pos = n - 1;

 

    for (auto it = cnt.begin();

         it != cnt.end(); ++it) {

 

        int x = -it->first;

        while (it->second) {

 

            

            ans[pos] = x;

            --it->second;

 

            

            

            for (int i = pos + 1; i < n; ++i)

 

                cnt[-gcd(ans[pos], ans[i])] -= 2;

 

            

            pos--;

        }

    }

 

    

    for (int i = 0; i < n; ++i)

        printf("%d ", ans[i]);

}

 

int main()

{

 

    

    n = 4;

    vector<int> mat{ 2, 1, 2, 3, 4, 3,

                     2, 6, 1, 1, 2,

                     2, 1, 2, 3, 2 };

 

    

    restoreArray(mat);

    return 0;

}

Complejidad del tiempo: EN2LogN)
Sala auxiliar: EN2)

¡Atención lectores! No dejes de aprender ahora. Obtenga todos los conceptos principales de DSA con el Curso de autoaprendizaje de DSA a un precio asequible para los estudiantes y apta para la industria. Para completar su preparación desde el aprendizaje de un idioma hasta DS Algo y mucho más, lea Toma el curso de preparación para entrevistas.

En caso de que quieras participar Clases en vivo con expertos, consulte Cursos en vivo de DSA para profesionales y Programación de competencias en vivo para estudiantes.

Source link