Contar números de un rango dado que tienen exactamente 5 factores distintos

Dados dos números enteros L y R , la tarea es calcular el conteo de números del rango [L, R] que tienen exactamente 5 factores positivos distintos.

Ejemplos: 

Entrada: L = 1, R= 100 
Salida:
Explicación: Los únicos dos números en el rango [1, 100] que tienen exactamente 5 factores primos son 16 y 81. Los 
factores de 16 son {1, 2, 4, 8, 16 }. 
Los factores de 8 son {1, 3, 9, 27, 81}.

Entrada: L = 1, R= 100 
Salida:

Enfoque ingenuo: el enfoque más simple para resolver este problema es atravesar el rango [L, R] y, para cada número, contar sus factores. Si el conteo de factores es igual a 5 , incremente el conteo en 1
Complejidad de tiempo: (R – L) × √N 
Espacio auxiliar: O(1)
Enfoque eficiente: Para optimizar el enfoque anterior, es necesario hacer la siguiente observación con respecto a los números que tienen exactamente 5 factores. 

Sea la descomposición en factores primos de un número p 1 a 1 ×p 2 a 2 × … ×p n a n
Por lo tanto, la cuenta de factores de este número se puede escribir como (a 1 + 1)×(a 2 + 1)× … ×(a n + 1). 
Como este producto debe ser igual a 5 (que es un número primo ), solo debe existir un término mayor que 1 en el producto. Ese término debe ser igual a 5. 
Por lo tanto, si a i + 1 = 5 
=> a i = 4

Siga los pasos a continuación para resolver el problema:  

  • El conteo requerido es el conteo de números en el rango que contiene p 4 como factor, donde p es un número primo.
  • Para calcular eficientemente p 4 para un amplio rango ( [1, 10 18 ] ), la idea es usar la Criba de Eratóstenes para almacenar todos los números primos hasta 10 4.5 .

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

C++14

// C++ Program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
const int N = 2e5;
 
// Stores all prime numbers
// up to 2 * 10^5
vector<long long> prime;
 
// Function to generate all prime
// numbers up to 2 * 10 ^ 5 using
// Sieve of Eratosthenes
void Sieve()
{
    prime.clear();
    vector<bool> p(N + 1, true);
 
    // Mark 0 and 1 as non-prime
    p[0] = p[1] = false;
 
    for (int i = 2; i * i <= N; i++) {
 
        // If i is prime
        if (p[i] == true) {
 
            // Mark all its factors as non-prime
            for (int j = i * i; j <= N; j += i) {
                p[j] = false;
            }
        }
    }
 
    for (int i = 1; i < N; i++) {
 
        // If current number is prime
        if (p[i]) {
 
            // Store the prime
            prime.push_back(1LL * pow(i, 4));
        }
    }
}
 
// Function to count numbers in the
// range [L, R] having exactly 5 factors
void countNumbers(long long int L,
                  long long int R)
{
 
    // Stores the required count
    int Count = 0;
 
    for (int p : prime) {
 
        if (p >= L && p <= R) {
            Count++;
        }
    }
    cout << Count << endl;
}
 
// Driver Code
int main()
{
    long long L = 16, R = 85000;
 
    Sieve();
 
    countNumbers(L, R);
 
    return 0;
}

Java

// Java Program to implement
// the above approach
import java.util.*;
class GFG
{
  static int N = 200000;
 
  // Stores all prime numbers
  // up to 2 * 10^5
  static int prime[] = new int [20000];
  static int index = 0;
 
  // Function to generate all prime
  // numbers up to 2 * 10 ^ 5 using
  // Sieve of Eratosthenes
  static void Sieve()
  {
    index = 0;
    int p[] = new int [N + 1];
    for(int i = 0; i <= N; i++)
    {
      p[i] = 1;
    }
 
    // Mark 0 and 1 as non-prime
    p[0] = p[1] = 0;
    for (int i = 2; i * i <= N; i++)
    {
 
      // If i is prime
      if (p[i] == 1)
      {
 
        // Mark all its factors as non-prime
        for (int j = i * i; j <= N; j += i)
        {
          p[j] = 0;
        }
      }
    }
    for (int i = 1; i < N; i++)
    {
 
      // If current number is prime
      if (p[i] == 1)
      {
 
        // Store the prime
        prime[index++] = (int)(Math.pow(i, 4));
      }
    }
  }
 
  // Function to count numbers in the
  // range [L, R] having exactly 5 factors
  static void countNumbers(int L,int R)
  {
 
    // Stores the required count
    int Count = 0;
    for(int i = 0; i < index; i++)
    {
      int p = prime[i];
      if (p >= L && p <= R)
      {
        Count++;
      }
    }
    System.out.println(Count);
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int L = 16, R = 85000;
    Sieve();
    countNumbers(L, R);
  }
}
 
// This code is contributed by amreshkumar3.

Python3

# Python3 implementation of
# the above approach
N = 2 * 100000
 
# Stores all prime numbers
# up to 2 * 10^5
prime = [0] * N
 
# Function to generate all prime
# numbers up to 2 * 10 ^ 5 using
# Sieve of Eratosthenes
def Sieve() :
    p = [True] * (N + 1)
 
    # Mark 0 and 1 as non-prime
    p[0] = p[1] = False
    i = 2
    while(i * i <= N) :
 
        # If i is prime
        if (p[i] == True) :
 
            # Mark all its factors as non-prime
            for j in range(i * i, N, i):
                p[j] = False    
        i += 1
    for i in range(N):
 
        # If current number is prime
        if (p[i] != False) :
 
            # Store the prime
            prime.append(pow(i, 4))
 
# Function to count numbers in the
# range [L, R] having exactly 5 factors
def countNumbers(L, R) :
 
    # Stores the required count
    Count = 0
    for p in prime :
        if (p >= L and p <= R) :
            Count += 1
    print(Count)
 
# Driver Code
L = 16
R = 85000
Sieve()
countNumbers(L, R)
 
# This code is contributed by code_hunt.

C#

// C# Program to implement
// the above approach
using System;
class GFG
{
  static int N = 200000;
 
  // Stores all prime numbers
  // up to 2 * 10^5
  static int []prime = new int [20000];
  static int index = 0;
 
  // Function to generate all prime
  // numbers up to 2 * 10 ^ 5 using
  // Sieve of Eratosthenes
  static void Sieve()
  {
    index = 0;
    int []p = new int [N + 1];
    for(int i = 0; i <= N; i++)
    {
      p[i] = 1;
    }
 
    // Mark 0 and 1 as non-prime
    p[0] = p[1] = 0;
    for (int i = 2; i * i <= N; i++)
    {
 
      // If i is prime
      if (p[i] == 1)
      {
 
        // Mark all its factors as non-prime
        for (int j = i * i; j <= N; j += i)
        {
          p[j] = 0;
        }
      }
    }
    for (int i = 1; i < N; i++)
    {
 
      // If current number is prime
      if (p[i] == 1)
      {
 
        // Store the prime
        prime[index++] = (int)(Math.Pow(i, 4));
      }
    }
  }
 
  // Function to count numbers in the
  // range [L, R] having exactly 5 factors
  static void countNumbers(int L,int R)
  {
 
    // Stores the required count
    int Count = 0;
    for(int i = 0; i < index; i++)
    {
      int p = prime[i];
      if (p >= L && p <= R)
      {
        Count++;
      }
    }
    Console.WriteLine(Count);
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
    int L = 16, R = 85000;
    Sieve();
    countNumbers(L, R);
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
// javascript program of the above approach
 
let N = 200000;
  
  // Stores all prime numbers
  // up to 2 * 10^5
  let prime = new Array(20000).fill(0);
  let index = 0;
  
  // Function to generate all prime
  // numbers up to 2 * 10 ^ 5 using
  // Sieve of Eratosthenes
  function Sieve()
  {
    index = 0;
    let p = new Array (N + 1).fill(0);
    for(let i = 0; i <= N; i++)
    {
      p[i] = 1;
    }
  
    // Mark 0 and 1 as non-prime
    p[0] = p[1] = 0;
    for (let i = 2; i * i <= N; i++)
    {
  
      // If i is prime
      if (p[i] == 1)
      {
  
        // Mark all its factors as non-prime
        for (let j = i * i; j <= N; j += i)
        {
          p[j] = 0;
        }
      }
    }
    for (let i = 1; i < N; i++)
    {
  
      // If current number is prime
      if (p[i] == 1)
      {
  
        // Store the prime
        prime[index++] = (Math.pow(i, 4));
      }
    }
  }
  
  // Function to count numbers in the
  // range [L, R] having exactly 5 factors
  function countNumbers(L, R)
  {
  
    // Stores the required count
    let Count = 0;
    for(let i = 0; i < index; i++)
    {
      let p = prime[i];
      if (p >= L && p <= R)
      {
        Count++;
      }
    }
    document.write(Count);
  }
 
    // Driver Code
     
    let L = 16, R = 85000;
    Sieve();
    countNumbers(L, R);
 
</script>
Producción: 

7

 

Complejidad de tiempo: O(N * log(log(N)) )
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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