Dada una array arr[] de N elementos, la tarea es encontrar el GCD de los elementos que tienen frecuencias principales en la array. Tenga en cuenta que 1 no es ni primo ni compuesto.
Ejemplos:
Entrada: arr[] = {5, 4, 6, 5, 4, 6}
Salida: 1
Todos los elementos aparecen 2 veces, lo cual es un número primo
Entonces, mcd(5, 4, 6) = 1
Entrada: arr[] = {4, 8, 8, 1, 4, 3, 0}
Salida: 4
Acercarse:
- Recorra la array y almacene las frecuencias de todos los elementos en un mapa .
- Construya la criba de Eratóstenes que se usará para probar la primalidad de un número en tiempo O(1).
- Calcule el gcd de los elementos que tienen una frecuencia principal utilizando la array Sieve calculada en el paso anterior.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to create Sieve to check primes void SieveOfEratosthenes(bool prime[], int p_size) { // False here indicates // that it is not prime prime[0] = false; prime[1] = false; for (int p = 2; p * p <= p_size; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p]) { // Update all multiples of p, // set them to non-prime for (int i = p * 2; i <= p_size; i += p) prime[i] = false; } } } // Function to return the GCD of elements // in an array having prime frequency int gcdPrimeFreq(int arr[], int n) { bool prime[n + 1]; memset(prime, true, sizeof(prime)); SieveOfEratosthenes(prime, n + 1); int i, j; // Map is used to store // element frequencies unordered_map<int, int> m; for (i = 0; i < n; i++) m[arr[i]]++; int gcd = 0; // Traverse the map using iterators for (auto it = m.begin(); it != m.end(); it++) { // Count the number of elements // having prime frequencies if (prime[it->second]) { gcd = __gcd(gcd, it->first); } } return gcd; } // Driver code int main() { int arr[] = { 5, 4, 6, 5, 4, 6 }; int n = sizeof(arr) / sizeof(arr[0]); cout << gcdPrimeFreq(arr, n); return 0; }
Java
// Java implementation of the approach import java.util.*; class GFG { // Function to create Sieve to check primes static void SieveOfEratosthenes(boolean prime[], int p_size) { // False here indicates // that it is not prime prime[0] = false; prime[1] = false; for (int p = 2; p * p <= p_size; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p]) { // Update all multiples of p, // set them to non-prime for (int i = p * 2; i <= p_size; i += p) prime[i] = false; } } } // Function to return the GCD of elements // in an array having prime frequency static int gcdPrimeFreq(int arr[], int n) { boolean []prime = new boolean[n + 1]; for (int i = 0; i < n + 1; i++) prime[i] = true; SieveOfEratosthenes(prime, n + 1); int i, j; // Map is used to store // element frequencies HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); for (i = 0 ; i < n; i++) { if(mp.containsKey(arr[i])) { mp.put(arr[i], mp.get(arr[i]) + 1); } else { mp.put(arr[i], 1); } } int gcd = 0; // Traverse the map using iterators for (Map.Entry<Integer, Integer> it : mp.entrySet()) { // Count the number of elements // having prime frequencies if (prime[it.getValue()]) { gcd = __gcd(gcd, it.getKey()); } } return gcd; } static int __gcd(int a, int b) { if (b == 0) return a; return __gcd(b, a % b); } // Driver code static public void main ( String []arg) { int arr[] = { 5, 4, 6, 5, 4, 6 }; int n = arr.length; System.out.println(gcdPrimeFreq(arr, n)); } } // This code is contributed by Rajput-Ji
Python3
# Python3 implementation of the approach from math import sqrt, gcd # Function to create Sieve to check primes def SieveOfEratosthenes(prime, p_size) : # False here indicates # that it is not prime prime[0] = False; prime[1] = False; for p in range(2, int(sqrt(p_size)) + 1) : # If prime[p] is not changed, # then it is a prime if (prime[p]) : # Update all multiples of p, # set them to non-prime for i in range(2 * p, p_size, p) : prime[i] = False; # Function to return the GCD of elements # in an array having prime frequency def gcdPrimeFreq(arr, n) : prime = [True] * (n + 1); SieveOfEratosthenes(prime, n + 1); # Map is used to store # element frequencies m = dict.fromkeys(arr, 0); for i in range(n) : m[arr[i]] += 1; __gcd = 0; # Traverse the map using iterators for key,value in m.items() : # Count the number of elements # having prime frequencies if (prime[value]) : __gcd = gcd(__gcd, key); return __gcd; # Driver code if __name__ == "__main__" : arr = [ 5, 4, 6, 5, 4, 6 ]; n = len(arr); print(gcdPrimeFreq(arr, n)); # This code is contributed by AnkitRai01
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG { // Function to create Sieve to check primes static void SieveOfEratosthenes(bool []prime, int p_size) { // False here indicates // that it is not prime prime[0] = false; prime[1] = false; for (int p = 2; p * p <= p_size; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p]) { // Update all multiples of p, // set them to non-prime for (int i = p * 2; i <= p_size; i += p) prime[i] = false; } } } // Function to return the GCD of elements // in an array having prime frequency static int gcdPrimeFreq(int []arr, int n) { int i; bool []prime = new bool[n + 1]; for (i = 0; i < n + 1; i++) prime[i] = true; SieveOfEratosthenes(prime, n + 1); // Map is used to store // element frequencies Dictionary<int, int> mp = new Dictionary<int, int>(); for (i = 0 ; i < n; i++) { if(mp.ContainsKey(arr[i])) { var val = mp[arr[i]]; mp.Remove(arr[i]); mp.Add(arr[i], val + 1); } else { mp.Add(arr[i], 1); } } int gcd = 0; // Traverse the map using iterators foreach(KeyValuePair<int, int> it in mp) { // Count the number of elements // having prime frequencies if (prime[it.Value]) { gcd = __gcd(gcd, it.Key); } } return gcd; } static int __gcd(int a, int b) { if (b == 0) return a; return __gcd(b, a % b); } // Driver code static public void Main ( String []arg) { int []arr = { 5, 4, 6, 5, 4, 6 }; int n = arr.Length; Console.WriteLine(gcdPrimeFreq(arr, n)); } } // This code is contributed by Princi Singh
Javascript
<script> // javascript implementation of the approach function gcd_two_numbers(x, y) { x = Math.abs(x); y = Math.abs(y); while(y) { var t = y; y = x % y; x = t; } return x; } // Function to create Sieve to check primes function SieveOfEratosthenes(prime, p_size){ // False here indicates // that it is not prime prime[0] = false; prime[1] = false; for (let p = 2; p * p <= p_size; p++) { // If prime[p] is not changed, // then it is a prime if (prime[p]) { // Update all multiples of p, // set them to non-prime for (let i = p * 2; i <= p_size; i += p) prime[i] = false; } } return prime; } // Function to return the GCD of elements // in an array having prime frequency function gcdPrimeFreq( arr, n){ let prime = []; for(let i = 0;i<n+1;i++){ prime.push(true); } prime = SieveOfEratosthenes(prime, n + 1); let i, j; // Map is used to store // element frequencies let m = new Map(); for (i = 0; i < n; i++){ if(m[arr[i]]) m[arr[i]]++; else m[arr[i]] = 1; } let gcd = 0; // Traverse the map using iterators for (var it in m) { // Count the number of elements // having prime frequencies if (prime[m[it]]) { gcd = gcd_two_numbers(gcd, it); } } return gcd; } // Driver code let a = [ 5, 4, 6, 5, 4, 6 ]; let len = a.length; document.write( gcdPrimeFreq(a, len)); </script>
Producción:
1
Complejidad de tiempo: O(n*log(log(n)))
Espacio auxiliar: O(n), ya que se utiliza un espacio extra de tamaño n
Publicación traducida automáticamente
Artículo escrito por NikhilRathor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA