Sum of elements in an array having prime frequency
Given an array arr, the task is to find the sum of the elements which have prime frequencies in the array.
Note: 1 is neither prime nor composite.
Examples:
Input: arr[] = {5, 4, 6, 5, 4, 6}
Output: 15
All the elements appear 2 times which is a prime
So, 5 + 4 + 6 = 15
Input: arr[] = {1, 2, 3, 3, 2, 3, 2, 3, 3}
Output: 5
Only 2 and 3 appears prime number of times i.e. 3 and 5 respectively.
So, 2 + 3 = 5
Approach:
- Traverse the array and store the frequencies of all the elements in a map.
- Build Sieve of Eratosthenes which will be used to test the primality of a number in O(1) time.
- Calculate the sum of elements having prime frequency using the Sieve array calculated in the previous step.
Below is the implementation of the above approach:
C++
// C++ program to find sum of elements // in an array having prime frequency #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 sum of elements // in an array having prime frequency int sumOfElements( 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 sum = 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]) { sum += (it->first); } } return sum; } // Driver code int main() { int arr[] = { 5, 4, 6, 5, 4, 6 }; int n = sizeof (arr) / sizeof (arr[0]); cout << sumOfElements(arr, n); return 0; } |
Java
// Java program to find sum of elements // in an array having prime frequency 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 sum of elements // in an array having prime frequency static int sumOfElements( int arr[], int n) { boolean prime[] = new boolean [n + 1 ]; Arrays.fill(prime, true ); SieveOfEratosthenes(prime, n + 1 ); int i, j; // Map is used to store // element frequencies HashMap<Integer, Integer> m = new HashMap<>(); for (i = 0 ; i < n; i++) { if (m.containsKey(arr[i])) m.put(arr[i], m.get(arr[i]) + 1 ); else m.put(arr[i], 1 ); } int sum = 0 ; // Traverse the map for (Map.Entry<Integer, Integer> entry : m.entrySet()) { int key = entry.getKey(); int value = entry.getValue(); // Count the number of elements // having prime frequencies if (prime[value]) { sum += (key); } } return sum; } // Driver code public static void main(String args[]) { int arr[] = { 5 , 4 , 6 , 5 , 4 , 6 }; int n = arr.length; System.out.println(sumOfElements(arr, n)); } } // This code is contributed by ghanshyampandey |
Python3
# Python3 program to find Sum of elements # in an array having prime frequency import math as mt # 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 , mt.ceil(mt.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 (p * 2 , p_size + 1 , p): prime[i] = False # Function to return the Sum of elements # in an array having prime frequency def SumOfElements(arr, n): prime = [ True for i in range (n + 1 )] SieveOfEratosthenes(prime, n + 1 ) i, j = 0 , 0 # Map is used to store # element frequencies m = dict () for i in range (n): if arr[i] in m.keys(): m[arr[i]] + = 1 else : m[arr[i]] = 1 Sum = 0 # Traverse the map using iterators for i in m: # Count the number of elements # having prime frequencies if (prime[m[i]]): Sum + = (i) return Sum # Driver code arr = [ 5 , 4 , 6 , 5 , 4 , 6 ] n = len (arr) print (SumOfElements(arr, n)) # This code is contributed # by Mohit kumar 29 |
C#
// C# program to find sum of elements // in an array having prime frequency 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 sum of elements // in an array having prime frequency static int sumOfElements( int []arr, int n) { bool []prime = new bool [n + 1]; for ( int i = 0; i < n+1; i++) prime[i] = true ; SieveOfEratosthenes(prime, n + 1); // Map is used to store // element frequencies Dictionary< int , int > m = new Dictionary< int , int >(); for ( int i = 0 ; i < n; i++) { if (m.ContainsKey(arr[i])) { var val = m[arr[i]]; m.Remove(arr[i]); m.Add(arr[i], val + 1); } else { m.Add(arr[i], 1); } } int sum = 0; // Traverse the map foreach (KeyValuePair< int , int > entry in m) { int key = entry.Key; int value = entry.Value; // Count the number of elements // having prime frequencies if (prime[value]) { sum += (key); } } return sum; } // Driver code public static void Main(String []args) { int []arr = { 5, 4, 6, 5, 4, 6 }; int n = arr.Length; Console.WriteLine(sumOfElements(arr, n)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // Javascript program to find sum of elements // in an array having prime frequency // 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 ; } } } // Function to return the sum of elements // in an array having prime frequency function sumOfElements(arr, n) { let prime = new Array(n + 1); prime.fill( true ) 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.has(arr[i])) m.set(arr[i], m.get(arr[i]) + 1); else m.set(arr[i], 1); } let sum = 0; // Traverse the map using iterators for (let it of m) { // Count the number of elements // having prime frequencies if (prime[it[1]]) { sum += (it[0]); } } return sum; } // Driver code let arr = [5, 4, 6, 5, 4, 6]; let n = arr.length; document.write(sumOfElements(arr, n)); // This code is contributed by gfgking </script> |
Output:
15
Time Complexity: O(n3/2)
Auxiliary Space: O(n)
Contact Us