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> |
15
Time Complexity: O(n3/2)
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!