Compruebe si cada elemento de la array dada es el producto de exactamente K números primos

Dada una array de números  A = \{a\textsubscript{1}, a\textsubscript{2} ... a\textsubscript{n}\}     y el valor de  k     , verifica si cada número  a\textsubscript{i} \in A     se puede expresar como el producto de  k     números primos exactos. Para cada elemento de la array, imprima ‘SÍ’ si se cumple la condición, de lo contrario, imprima ‘NO’.
Nota: También se pueden considerar números primos repetidos. Por ejemplo, si k = 2, entonces n = 4 (=2*2) es una entrada válida.
Consideremos el número 36. 36 se puede factorizar como 2*2*3*3. Por lo tanto, es el producto de 4 números primos. Si el valor de k es 4, entonces la salida debe ser . Para otros valores de k, la salida debe ser NO .
Más ejemplos: 
 

Input:  arr[] = {30, 8, 12}, K = 3 
Output: YES, YES, YES
30 = 2*3*5
8 = 2*2*2
12 = 2*3*2

Input: arr[] = {30, 16, 32}, k = 5
Output: NO, NO, YES
Only 32 can be represented as product of 
5 prime numbers.

En este artículo, comprobaremos si los números dados se pueden expresar como el producto de exactamente k números primos. El concepto subyacente que estaremos usando es simplemente una variación del Tamiz de Eratóstenes .
Recomendado: Cómo construir el Tamiz de Eratóstenes
 

Diferencia clave: en el tamiz, en lugar de almacenar valores binarios (0 si el número no es primo, 1 si el número es primo), podemos almacenar cuántos factores primos (repetitivos) componen ese número. Esta modificación se realiza durante su construcción. 

El procedimiento generalizado para crear este tamiz modificado es el siguiente: 
 

  1. Cree una array llena de 0 para almacenar la lista de enteros consecutivos (2, 3, 4… 10^6).
  2. Deje que el valor de i se establezca en 2 inicialmente. Este es nuestro primer número primo.
  3. Recorra todos los múltiplos de i (2*i, 3*i… hasta 10^6) almacenando su valor como j. Continúe con los pasos 3 y 4.
  4. Calcule el número de veces que j se puede factorizar usando i y almacene el resultado en la variable conteo.
  5. Cuando el número j no se puede factorizar más usando i, incremente el valor de Sieve[j] por el valor de conteo.
  6. Finalmente, encuentre el siguiente número primo mayor que i en la lista de enteros. Si no hay tal número, termine el proceso. De lo contrario, siga desde el paso 2 nuevamente.

Explicación con ejemplo:
PASO 1:
La array de tamices vacía inicializada se ve como se ilustra a continuación. En aras de la simplicidad, concentrémonos solo en los índices 2 a 12. Los valores almacenados inicialmente son 0 para todos los índices.
Ahora, el primer número primo que tomaremos es 2. Este es el valor de i.
 

PASO 2:
Inicialice la variable j para que contenga el valor de cada múltiplo subsiguiente de i a partir de 2*i, que en este caso es 4.
 

PASO 3:
El tercer paso implica el cálculo de la descomposición en factores primos de j. Más específicamente, solo estamos interesados ​​en contar el número de ocurrencias de i cuando factorizas j.
El procedimiento de cálculo es simple. Simplemente divide el valor de j con i hasta obtener un número que no sea divisible por i. Aquí, 4 se puede dividir por 2 dos veces. 4/2 da 2 y 2/2 da 1, que no es divisible por 2 y el ciclo se detiene. Por lo tanto, actualizamos el valor de Sieve[4] con el valor de la variable de conteo, que es 2.
 

PASO 4:
Podemos proceder con los otros elementos de manera similar. Luego, el valor de j es 6. 6 solo se puede dividir por 2 una vez. Por lo tanto, el valor de Sieve[6] es 1.
 

La array Sieve calculada final debería verse así. Tenga en cuenta que cualquier índice que almacene el valor 0 representa un número que no es el producto de 2 o más números primos. Esto incluye todos los números primos, 0 y 1.
La segunda cosa a tener en cuenta es que solo necesitamos verificar 
 

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

C++

// C++ program to check if each element of
// the given array is a product of exactly
// K prime factors
 
#include <iostream>
#define MAX 1000000
using namespace std;
 
// initialise the global sieve array
int Sieve[MAX] = { 0 };
 
// Function to generate Sieve
void constructSieve()
{
    // NOTE: k value is necessarily more than 1
    // hence, 0, 1 and any prime number cannot be
    // represented as product of
    // two or more prime numbers
 
    for (int i = 2; i <= MAX; i++) {
        if (Sieve[i] == 0) {
            for (int j = 2 * i; j <= MAX; j += i) {
                int temp = j;
                while (temp > 1 && temp % i == 0) {
                    Sieve[j]++;
                    temp = temp / i;
                }
            }
        }
    }
}
 
// Function to check if each number of array
// satisfies the given condition
void checkElements(int A[], int n, int k)
{
    for (int i = 0; i < n; i++) {
        if (Sieve[A[i]] == k) {
            cout << "YES\n";
        }
        else {
            cout << "NO\n";
        }
    }
}
 
// Driver Code
int main()
{
    // first construct the sieve
    constructSieve();
 
    int k = 3;
    int A[] = { 12, 36, 42, 72 };
    int n = sizeof(A) / sizeof(int);
 
    checkElements(A, n, k);
 
    return 0;
}

Java

// Java program to check if each element of
// the given array is a product of exactly
// K prime factors
import java.util.*;
 
class GFG
{
 
    static int MAX = 1000000;
 
    // initialise the global sieve array
    static int[] Sieve = new int[MAX+1];
 
    // Function to generate Sieve
    static void constructSieve()
    {
        // NOTE: k value is necessarily more than 1
        // hence, 0, 1 and any prime number cannot be
        // represented as product of
        // two or more prime numbers
 
        for (int i = 2; i <= MAX; i++)
        {
            if (Sieve[i] == 0)
            {
                for (int j = 2 * i; j <= MAX; j += i)
                {
                    int temp = j;
                    while (temp > 1 && temp % i == 0)
                    {
                        Sieve[j]++;
                        temp = temp / i;
                    }
                }
            }
        }
    }
 
    // Function to check if each number of array
    // satisfies the given condition
    static void checkElements(int A[], int n, int k)
    {
        for (int i = 0; i < n; i++)
        {
            if (Sieve[A[i]] == k)
            {
                System.out.println("YES");
            }
            else
            {
                System.out.println("No");
            }
 
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // first construct the sieve
        constructSieve();
 
        int k = 3;
        int A[] = {12, 36, 42, 72};
        int n = A.length;
 
        checkElements(A, n, k);
    }
}
 
// This code contributed by Rajput-Ji

Python3

# Python3 program to check if each element of
# the given array is a product of exactly
# K prime factors
 
MAX = 1000000
 
# initialise the global sieve array
Sieve = [0]*(MAX + 1)
 
# Function to generate Sieve
def constructSieve() :
 
    # NOTE: k value is necessarily more than 1
    # hence, 0, 1 and any prime number cannot be
    # represented as product of
    # two or more prime numbers
 
    for i in range(2, MAX + 1) :
        if (Sieve[i] == 0) :
            for j in range(2*i, MAX + 1, i) :
                temp = j;
                while (temp > 1 and temp % i == 0) :
                    Sieve[j] += 1;
                    temp = temp // i;
         
 
# Function to check if each number of array
# satisfies the given condition
def checkElements(A, n, k) :
 
    for i in range(n) :
        if (Sieve[A[i]] == k) :
            print("YES");
             
        else :
            print("NO");
 
# Driver Code
if __name__ == "__main__" :
 
    # first construct the sieve
    constructSieve();
 
    k = 3;
    A = [ 12, 36, 42, 72 ];
    n = len(A);
 
    checkElements(A, n, k);
     
# This code is contributed by AnkitRai01

C#

// C# program to check if each element of
// the given array is a product of exactly
// K prime factors
using System;
 
class GFG
{
 
    static int MAX = 1000000;
 
    // initialise the global sieve array
    static int[] Sieve = new int[MAX+1];
 
    // Function to generate Sieve
    static void constructSieve()
    {
        // NOTE: k value is necessarily more than 1
        // hence, 0, 1 and any prime number cannot be
        // represented as product of
        // two or more prime numbers
 
        for (int i = 2; i <= MAX; i++)
        {
            if (Sieve[i] == 0)
            {
                for (int j = 2 * i; j <= MAX; j += i)
                {
                    int temp = j;
                    while (temp > 1 && temp % i == 0)
                    {
                        Sieve[j]++;
                        temp = temp / i;
                    }
                }
            }
        }
    }
 
    // Function to check if each number of array
    // satisfies the given condition
    static void checkElements(int []A, int n, int k)
    {
        for (int i = 0; i < n; i++)
        {
            if (Sieve[A[i]] == k)
            {
                Console.WriteLine("YES");
            }
            else
            {
                Console.WriteLine("No");
            }
 
        }
    }
 
    // Driver Code
    public static void Main()
    {
        // first construct the sieve
        constructSieve();
 
        int k = 3;
        int []A = {12, 36, 42, 72};
        int n = A.Length;
 
        checkElements(A, n, k);
    }
}
 
// This code contributed by anuj_67...

Javascript

<script>
 
// Javascript program to check if each element of
// the given array is a product of exactly
// K prime factors
 
const MAX = 1000000;
 
// initialise the global sieve array
let Sieve = new Array(MAX).fill(0);
 
// Function to generate Sieve
function constructSieve()
{
    // NOTE: k value is necessarily more than 1
    // hence, 0, 1 and any prime number cannot be
    // represented as product of
    // two or more prime numbers
 
    for (let i = 2; i <= MAX; i++) {
        if (Sieve[i] == 0) {
            for (let j = 2 * i; j <= MAX; j += i)
            {
                let temp = j;
                while (temp > 1 && temp % i == 0)
                {
                    Sieve[j]++;
                    temp = parseInt(temp / i);
                }
            }
        }
    }
}
 
// Function to check if each number of array
// satisfies the given condition
function checkElements(A, n, k)
{
    for (let i = 0; i < n; i++) {
        if (Sieve[A[i]] == k) {
            document.write("YES<br>");
        }
        else {
            document.write("NO<br>");
        }
    }
}
 
// Driver Code
 
    // first construct the sieve
    constructSieve();
 
    let k = 3;
    let A = [ 12, 36, 42, 72 ];
    let n = A.length;
 
    checkElements(A, n, k);
 
</script>
Producción: 

YES
NO
YES
NO

 

Complejidad de tiempo: O(n*log(logn)), donde n es la longitud de la array A.
Complejidad de espacio : O(MAX), donde MAX es 10 6 .
 

Publicación traducida automáticamente

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