Sum of elements in an array having prime frequency

• Last Updated : 21 May, 2021

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:
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 ``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 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 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

 ``

Output:

`15`

My Personal Notes arrow_drop_up