Given an array arr[] of non-negative integers where 2 ? arr[i] ? 106. The task is to find the sum of all those elements from the array whose prime factors are present in the same array. Examples:
Input: arr[] = {2, 3, 10} Output: 5 Factor of 2 is 2 which is present in the array Factor of 3 is 3, also present in the array Factors of 10 are 2 and 5, out of which only 2 is present in the array. So, sum = 2 + 3 = 5 Input: arr[] = {5, 11, 55, 25, 100} Output: 96
Approach: The idea is to first calculate the least prime factor till maximum element of the array with Prime Factorization using Sieve.
- Now, Iterate the array and for an element arr[i]
- If arr[i] != 1:
- If leastPrimeFactor(arr[i]) is present in the array then update arr[i] / leastPrimeFactor(arr[i]) and go to step 2.
- Else go to step 1.
- Else update sum = sum + originalVal(arr[i]).
- Print the sum in the end.
Below is the implementation of the above approach:Â
C++
// C++ program to find the sum of the elements of an array// whose prime factors are present in the same array#include <bits/stdc++.h>using namespace std;Â
#define MAXN 1000001Â
// Stores smallest prime factor for every numberint spf[MAXN];Â
// Function to calculate SPF (Smallest Prime Factor)// for every number till MAXNvoid sieve(){Â Â Â Â spf[1] = 1;Â Â Â Â for (int i = 2; i < MAXN; i++)Â
        // Marking smallest prime factor for every        // number to be itself.        spf[i] = i;Â
    // Separately marking spf for every even    // number as 2    for (int i = 4; i < MAXN; i += 2)        spf[i] = 2;Â
    for (int i = 3; i * i < MAXN; i++) {Â
        // If i is prime        if (spf[i] == i) {Â
            // Marking SPF for all numbers divisible by i            for (int j = i * i; j < MAXN; j += i)Â
                // Marking spf[j] if it is not                // previously marked                if (spf[j] == j)                    spf[j] = i;        }    }}Â
// Function to return the sum of the elements of an array// whose prime factors are present in the same arrayint sumFactors(int arr[], int n){Â
    // Function call to calculate smallest prime factors of    // all the numbers upto MAXN    sieve();Â
    // Create map for each element    std::map<int, int> map;Â
    for (int i = 0; i < n; ++i)        map[arr[i]] = 1;Â
    int sum = 0;Â
    for (int i = 0; i < n; ++i) {        int num = arr[i];Â
        // If smallest prime factor of num is present in array        while (num != 1 && map[spf[num]] == 1) {            num /= spf[num];        }Â
        // Each factor of arr[i] is present in the array        if (num == 1)            sum += arr[i];    }Â
    return sum;}Â
// Driver programint main(){Â Â Â Â int arr[] = { 5, 11, 55, 25, 100 };Â Â Â Â int n = sizeof(arr) / sizeof(arr[0]);Â
    // Function call to print required answer    cout << sumFactors(arr, n);    return 0;} |
Java
// Java program to find the sum of the elements of an array // whose prime factors are present in the same array Â
import java.util.*;Â Â
public class GFG{Â
final static int MAXN = 1000001 ;Â
// Stores smallest prime factor for every number static int spf[] = new int [MAXN]; Â
    // Function to calculate SPF (Smallest Prime Factor)     // for every number till MAXN     static void sieve()     {         spf[1] = 1;         for (int i = 2; i < MAXN; i++)                  // Marking smallest prime factor for every             // number to be itself.             spf[i] = i;              // Separately marking spf for every even         // number as 2         for (int i = 4; i < MAXN; i += 2)             spf[i] = 2;              for (int i = 3; i * i < MAXN; i++) {                  // If i is prime             if (spf[i] == i) {                      // Marking SPF for all numbers divisible by i                 for (int j = i * i; j < MAXN; j += i)                          // Marking spf[j] if it is not                     // previously marked                     if (spf[j] == j)                         spf[j] = i;             }         }     }          // Function to return the sum of the elements of an array     // whose prime factors are present in the same array     static int sumFactors(int arr[], int n)     {              // Function call to calculate smallest prime factors of         // all the numbers upto MAXN         sieve();              // Create map for each element         Map map=new HashMap();                 for(int i = 0 ; i < MAXN ; ++i)            map.put(i,0) ;                     for (int i = 0; i < n; ++i)             map.put(arr[i],1);                       int sum = 0;              for (int i = 0; i < n; ++i) {             int num = arr[i];                  // If smallest prime factor of num is present in array             while (num != 1 && (int)(map.get(spf[num])) == 1) {                 num /= spf[num];             }                  // Each factor of arr[i] is present in the array             if (num == 1)                 sum += arr[i];         }              return sum;     }          // Driver program      public static void main(String []args)    {         int arr[] = { 5, 11, 55, 25, 100 };         int n = arr.length ;             // Function call to print required answer          System.out.println(sumFactors(arr, n)) ;    }     // This code is contributed by Ryuga} |
Python3
# Python program to find the sum of the # elements of an array whose prime factors# are present in the same array from collections import defaultdictÂ
MAXN = 1000001MAXN_sqrt = int(MAXN ** (0.5))Â
# Stores smallest prime factor# for every number spf = [None] * (MAXN) Â
# Function to calculate SPF (Smallest # Prime Factor) for every number till MAXN def sieve():Â
    spf[1] = 1    for i in range(2, MAXN): Â
        # Marking smallest prime factor         # for every number to be itself.         spf[i] = i Â
    # Separately marking spf for every     # even number as 2     for i in range(4, MAXN, 2):         spf[i] = 2Â
    for i in range(3, MAXN_sqrt): Â
        # If i is prime         if spf[i] == i:Â
            # Marking SPF for all numbers             # divisible by i             for j in range(i * i, MAXN, i): Â
                # Marking spf[j] if it is                 # not previously marked                 if spf[j] == j:                    spf[j] = i          # Function to return the sum of the elements # of an array whose prime factors are present # in the same array def sumFactors(arr, n): Â
    # Function call to calculate smallest     # prime factors of all the numbers upto MAXN     sieve() Â
    # Create map for each element     Map = defaultdict(lambda:0) Â
    for i in range(0, n):         Map[arr[i]] = 1Â
    Sum = 0Â
    for i in range(0, n):         num = arr[i]                  # If smallest prime factor of num        # is present in array         while num != 1 and Map[spf[num]] == 1:             num = num // spf[num]                  # Each factor of arr[i] is present         # in the array         if num == 1:             Sum += arr[i]          return SumÂ
# Driver Codeif __name__ == "__main__":Â
    arr = [5, 11, 55, 25, 100]     n = len(arr) Â
    # Function call to print     # required answer     print(sumFactors(arr, n)) Â
# This code is contributed by Rituraj Jain |
C#
// C# program to find the sum of the elements // of an array whose prime factors are present// in the same array using System;using System.Collections.Generic;Â
class GFG{    static int MAXN = 1000001;         // Stores smallest prime factor for every number     static int []spf = new int [MAXN]; Â
    // Function to calculate SPF (Smallest Prime Factor)     // for every number till MAXN     static void sieve()     {         spf[1] = 1;         for (int i = 2; i < MAXN; i++)                  // Marking smallest prime factor for             // every number to be itself.             spf[i] = i;              // Separately marking spf for every even         // number as 2         for (int i = 4; i < MAXN; i += 2)             spf[i] = 2;              for (int i = 3; i * i < MAXN; i++)         {                  // If i is prime             if (spf[i] == i)            {                      // Marking SPF for all numbers divisible by i                 for (int j = i * i; j < MAXN; j += i)                          // Marking spf[j] if it is not                     // previously marked                     if (spf[j] == j)                         spf[j] = i;             }         }     }          // Function to return the sum of the elements     // of an array whose prime factors are present     // in the same array     static int sumFactors(int []arr, int n)     {              // Function call to calculate smallest         // prime factors of all the numbers upto MAXN         sieve();              // Create map for each element         Dictionary<int, int> map = new Dictionary<int, int>();                 for(int i = 0 ; i < MAXN ; ++i)            map.Add(i, 0);                     for (int i = 0; i < n; ++i)        {            if(map.ContainsKey(arr[i]))            {                map[arr[i]] = 1;             }            else            {                map.Add(arr[i], 1);            }        }                 int sum = 0;              for (int i = 0; i < n; ++i)         {             int num = arr[i];                  // If smallest prime factor of num             // is present in array             while (num != 1 &&              (int)(map[spf[num]]) == 1)             {                 num /= spf[num];             }                  // Each factor of arr[i] is present            // in the array             if (num == 1)                 sum += arr[i];         }         return sum;     }          // Driver Code    public static void Main(String []args)    {         int []arr = { 5, 11, 55, 25, 100 };         int n = arr.Length;             // Function call to print required answer         Console.WriteLine(sumFactors(arr, n));    } }Â
// This code is contributed by PrinciRaj1992 |
Javascript
// JavaScript program to find the sum of the // elements of an array whose prime factors// are present in the same array let MAXN = 1000001let MAXN_sqrt = Math.floor(MAXN ** (0.5))Â
// Stores smallest prime factor// for every number let spf = new Array(MAXN) Â
// Function to calculate SPF (Smallest // Prime Factor) for every number till MAXN function sieve(){    spf[1] = 1    for (var i = 2; i < MAXN; i++)     {        // Marking smallest prime factor         // for every number to be itself.         spf[i] = i     }         // Separately marking spf for every     // even number as 2     for (var i = 4; i < MAXN; i += 2)         spf[i] = 2Â
    for (var i = 3; i < MAXN_sqrt; i++)     {        // If i is prime         if (spf[i] == i)        {            // Marking SPF for all numbers             // divisible by i             for (var j = i * i; j < MAXN; j += i)             {                // Marking spf[j] if it is                 // not previously marked                 if (spf[j] == j)                    spf[j] = i             }        }    }}         // Function to return the sum of the elements // of an array whose prime factors are present // in the same array function sumFactors(arr, n){    // Function call to calculate smallest     // prime factors of all the numbers upto MAXN     sieve() Â
    // Create map for each element     let Map = {}Â
    for (var i = 0; i < n; i++)         Map[arr[i]] = 1Â
    let Sum = 0Â
    for (var i = 0; i < n; i++)    {        let num = arr[i]                  // If smallest prime factor of num        // is present in array         while (num != 1 && Map.hasOwnProperty(spf[num]))            num = Math.floor(num / spf[num])                 // Each factor of arr[i] is present         // in the array         if (num == 1)             Sum += arr[i]     }         return Sum}Â
Â
// Driver Codelet arr = [5, 11, 55, 25, 100] let n = arr.length Â
// Function call to print // required answer console.log(sumFactors(arr, n)) Â
// This code is contributed by phasing17 |
96
Time Complexity: O(MAXN*log(log(MAXN)))
Auxiliary Space: O(MAXN)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
