Skip to content
Related Articles
Sum of all prime divisors of all the numbers in range L-R
• Difficulty Level : Medium
• Last Updated : 14 May, 2021

Given two integers L and R. The task is to find the sum of all prime factors of every number in the range[L-R].

Examples:

Input: l = 5, r = 10
Output: 17
5 is prime, hence sum of factors = 0
6 has prime factors 2 and 3, hence sum = 5
7 is prime, hence sum = 0
8 has prime factor 2, hence sum = 2
9 has prime factor 3, hence sum = 3
10 has prime factors 2 and 5, hence sum = 7
Hence, total sum = 5 + 2 + 3 + 7 = 17
Input: l = 18, r = 25
Output: 45
18 has prime factors 2, 3 hence sum = 5
19 is prime, hence sum of factors = 0
20 has prime factors 2 and 5, hence sum = 7
21 has prime factors 3 and 7, hence sum = 10
22 has prime factors 2 and 11, hence sum = 13
23 is prime. hence sum = 0
24 has prime factors 2 and 3, hence sum = 5
25 has prime factor 5, hence sum = 5
Hence, total sum = 5 + 7 + 10 + 13 + 5 + 5 = 45

A naive approach would be to start iterating through all numbers from l to r. For each iteration, start from 2 to i and find if i is divisible by that number, if it is divisible, we simply add i and proceed.

Below is the implementation of the above approach.

## C++

 `// C++ program to find the sum of prime``// factors of all numbers in range [L-R]` `#include ``using` `namespace` `std;`` ``bool` `isPrime(``int` `n)``    ``{``        ``for` `(``int` `i = 2; i * i <= n; i++) {` `            ``// n has a factor, hence not a prime``            ``if` `(n % i == 0)``                ``return` `false``;``        ``}``        ``// we reach here if n has no factors``        ``// and hence n is a prime number``        ``return` `true``;``    ``}``     ``int` `sum(``int` `l, ``int` `r)``    ``{``        ``int` `sum = 0;` `        ``// iterate from lower to upper``        ``for` `(``int` `i = l; i <= r; i++) {` `            ``// if i is prime, it has no factors``            ``if` `(isPrime(i))``                ``continue``;``            ``for` `(``int` `j = 2; j < i; j++) {` `                ``// check if j is a prime factor of i``                ``if` `(i % j == 0 && isPrime(j))``                    ``sum += j;``            ``}``        ``}``        ``return` `sum;``    ``}``// Driver code``int` `main() {``        ``int` `l = 18, r = 25;``        ``cout<<(sum(l, r));``    ` `    ``return` `0;``}`

## Java

 `// Java program to find the sum of prime``// factors of all numbers in range [L-R]``class` `gfg {``    ``static` `boolean` `isPrime(``int` `n)``    ``{``        ``for` `(``int` `i = ``2``; i * i <= n; i++) {` `            ``// n has a factor, hence not a prime``            ``if` `(n % i == ``0``)``                ``return` `false``;``        ``}``        ``// we reach here if n has no factors``        ``// and hence n is a prime number``        ``return` `true``;``    ``}``    ``static` `int` `sum(``int` `l, ``int` `r)``    ``{``        ``int` `sum = ``0``;` `        ``// iterate from lower to upper``        ``for` `(``int` `i = l; i <= r; i++) {` `            ``// if i is prime, it has no factors``            ``if` `(isPrime(i))``                ``continue``;``            ``for` `(``int` `j = ``2``; j < i; j++) {` `                ``// check if j is a prime factor of i``                ``if` `(i % j == ``0` `&& isPrime(j))``                    ``sum += j;``            ``}``        ``}``        ``return` `sum;``    ``}``    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `l = ``18``, r = ``25``;``        ``System.out.println(sum(l, r));``    ``}``}`

## Python3

 `# Python3 program to find the sum of prime``# factors of all numbers in range [L-R]` `def` `isPrime(n):``    ` `    ``i ``=` `2``    ``while` `i ``*` `i <``=` `n:` `        ``# n has a factor, hence not a prime``        ``if` `(n ``%` `i ``=``=` `0``):``            ``return` `False``        ``i ``+``=` `1``        ` `    ``# we reach here if n has no factors``    ``# and hence n is a prime number``    ``return` `True``    ` `def` `sum``(l, r):``    ``sum` `=` `0` `    ``# iterate from lower to upper``    ``for` `i ``in` `range``(l, r ``+` `1``) :` `        ``# if i is prime, it has no factors``        ``if` `(isPrime(i)) :``            ``continue``        ``for` `j ``in` `range``(``2``, i):` `            ``# check if j is a prime factor of i``            ``if` `(i ``%` `j ``=``=` `0` `and` `isPrime(j)) :``                ``sum` `+``=` `j``        ` `    ``return` `sum``    ` `# Driver code``if` `__name__ ``=``=` `"__main__"``:``        ``l ``=` `18``        ``r ``=` `25``        ``print``(``sum``(l, r))` `# This code is contributed by ita_c`

## C#

 `// C# program to find the sum``// of prime factors of all``// numbers in range [L-R]``using` `System;` `class` `GFG``{``    ``static` `bool` `isPrime(``int` `n)``    ``{``        ``for` `(``int` `i = 2;``                 ``i * i <= n; i++)``        ``{` `            ``// n has a factor,``            ``// hence not a prime``            ``if` `(n % i == 0)``                ``return` `false``;``        ``}``        ` `        ``// we reach here if n has``        ``// no factors and hence n``        ``// is a prime number``        ``return` `true``;``    ``}``    ` `    ``static` `int` `sum(``int` `l, ``int` `r)``    ``{``        ``int` `sum = 0;` `        ``// iterate from lower to upper``        ``for` `(``int` `i = l; i <= r; i++)``        ``{` `            ``// if i is prime, it``            ``// has no factors``            ``if` `(isPrime(i))``                ``continue``;``            ``for` `(``int` `j = 2; j < i; j++)``            ``{` `                ``// check if j is a``                ``// prime factor of i``                ``if` `(i % j == 0 && isPrime(j))``                    ``sum += j;``            ``}``        ``}``        ``return` `sum;``    ``}``    ` `    ``// Driver code``    ``public` `static` `void` `Main()``    ``{``        ``int` `l = 18, r = 25;``        ``Console.WriteLine(sum(l, r));``    ``}``}` `// This code is contributed``// by Akanksha Rai(Abby_akku)`

## PHP

 ``

## Javascript

 ``
Output:
`45`

Time Complexity: O(N * N * sqrt(N))

An efficient approach is to modify the sieve of eratosthenes slightly to find sum of all prime divisors. Next, maintain a prefix array to keep the sum of the sum of all prime divisors up to index i. Hence, pref_arr[r] – pref_arr[l-1] would give the answer.

Below is the implementation of the above approach.

## C++

 `// C++ program to find the sum of prime``// factors of all numbers in range [L-R]``#include``using` `namespace` `std;` `#define N 10000``long` `arr[N];` `    ``// function to compute the sieve``    ``void` `sieve()``    ``{``        ``for` `(``int` `i = 2; i * i < N; i++)``        ``{` `            ``// i is prime``            ``if` `(arr[i] == 0)``            ``{` `                ``// add i to all the multiples of i till N``                ``for` `(``int` `j = 2; i * j < N; j++)``                ``{``                    ``arr[i * j] += i;``                ``}``            ``}``        ``}``    ``}` `    ``// function that returns the sum``    ``long` `sum(``int` `l, ``int` `r)``    ``{` `        ``// Function call to compute sieve``        ``sieve();` `        ``// prefix array to keep the``        ``// sum of all arr[i] till i``        ``long` `pref_arr[r+1];``        ``pref_arr = arr;` `        ``// calculate the prefix sum of prime divisors``        ``for` `(``int` `i = 1; i <= r; i++) {``            ``pref_arr[i] = pref_arr[i - 1] + arr[i];``        ``}` `        ``// lower is the beginning of array``        ``if` `(l == 1)``            ``return` `(pref_arr[r]);` `        ``// lower is not the beginning of the array``        ``else``            ``return` `(pref_arr[r] - pref_arr[l - 1]);``    ``}` `    ``// Driver Code``    ``int` `main()``    ``{``        ``int` `l = 5, r = 10;``        ``cout<<(sum(l, r));``        ``return` `0;``    ``}``    ` `// This code is contributed by Rajput-Ji`

## Java

 `// Java program to find the sum of prime``// factors of all numbers in range [L-R]``public` `class` `gfg {` `    ``static` `int` `N = ``10000``;``    ``static` `long` `arr[] = ``new` `long``[N];` `    ``// function to compute the sieve``    ``static` `void` `sieve()``    ``{``        ``for` `(``int` `i = ``2``; i * i < N; i++) {` `            ``// i is prime``            ``if` `(arr[i] == ``0``) {` `                ``// add i to all the multiples of i till N``                ``for` `(``int` `j = ``2``; i * j < N; j++) {``                    ``arr[i * j] += i;``                ``}``            ``}``        ``}``    ``}` `    ``// function that returns the sum``    ``static` `long` `sum(``int` `l, ``int` `r)``    ``{` `        ``// Function call to compute sieve``        ``sieve();` `        ``// prefix array to keep the sum of all arr[i] till i``        ``long``[] pref_arr = ``new` `long``[r + ``1``];``        ``pref_arr[``0``] = arr[``0``];` `        ``// calculate the prefix sum of prime divisors``        ``for` `(``int` `i = ``1``; i <= r; i++) {``            ``pref_arr[i] = pref_arr[i - ``1``] + arr[i];``        ``}` `        ``// lower is the beginning of array``        ``if` `(l == ``1``)``            ``return` `(pref_arr[r]);` `        ``// lower is not the beginning of the array``        ``else``            ``return` `(pref_arr[r] - pref_arr[l - ``1``]);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `l = ``5``, r = ``10``;``        ``System.out.println(sum(l, r));``    ``}``}`

## Python3

 `# Python3 program to find the sum of prime``# factors of all numbers in range [L-R]``N ``=` `10000``;``arr ``=` `[``0``] ``*` `N;` `# function to compute the sieve``def` `sieve():``    ``i ``=` `2``;``    ``while``(i ``*` `i < N):``        ` `        ``# i is prime``        ``if` `(arr[i] ``=``=` `0``):``            ` `            ``# add i to all the multiple``            ``# of i till N``            ``j ``=` `2``;``            ``while` `(i ``*` `j < N):``                ``arr[i ``*` `j] ``+``=` `i;``                ``j ``+``=` `1``;``        ``i ``+``=` `1``;` `# function that returns the sum``def` `sum``(l, r):` `    ``# Function call to compute sieve``    ``sieve();` `    ``# prefix array to keep the``    ``# sum of all arr[i] till i``    ``pref_arr ``=` `[``0``] ``*` `(r ``+` `1``);``    ``pref_arr[``0``] ``=` `arr[``0``];` `    ``# calculate the prefix sum``    ``# of prime divisors``    ``for` `i ``in` `range``(``1``, r ``+` `1``):``        ``pref_arr[i] ``=` `pref_arr[i ``-` `1``] ``+` `arr[i];` `    ``# lower is the beginning of array``    ``if` `(l ``=``=` `1``):``        ``return` `(pref_arr[r]);` `    ``# lower is not the beginning``    ``# of the array``    ``else``:``        ``return` `(pref_arr[r] ``-``                ``pref_arr[l ``-` `1``]);` `# Driver Code``l ``=` `5``;``r ``=` `10``;``print``(``sum``(l, r));` `# This code is contributed by mits`

## C#

 `// C# program to find the sum``// of prime factors of all``// numbers in range [L-R]``using` `System;` `class` `GFG``{``    ``static` `int` `N = 10000;``    ``static` `long``[] arr = ``new` `long``[N];` `    ``// function to compute``    ``// the sieve``    ``static` `void` `sieve()``    ``{``        ``for` `(``int` `i = 2; i * i < N; i++)``        ``{` `            ``// i is prime``            ``if` `(arr[i] == 0)``            ``{` `                ``// add i to all the multiples``                ``// of i till N``                ``for` `(``int` `j = 2;``                         ``i * j < N; j++)``                ``{``                    ``arr[i * j] += i;``                ``}``            ``}``        ``}``    ``}` `    ``// function that``    ``// returns the sum``    ``static` `long` `sum(``int` `l, ``int` `r)``    ``{` `        ``// Function call to``        ``// compute sieve``        ``sieve();` `        ``// prefix array to keep the``        ``// sum of all arr[i] till i``        ``long``[] pref_arr = ``new` `long``[r + 1];``        ``pref_arr = arr;` `        ``// calculate the prefix``        ``// sum of prime divisors``        ``for` `(``int` `i = 1; i <= r; i++)``        ``{``            ``pref_arr[i] = pref_arr[i - 1] +``                               ``arr[i];``        ``}` `        ``// lower is the beginning``        ``// of array``        ``if` `(l == 1)``            ``return` `(pref_arr[r]);` `        ``// lower is not the``        ``// beginning of the array``        ``else``            ``return` `(pref_arr[r] -``                    ``pref_arr[l - 1]);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main()``    ``{``        ``int` `l = 5, r = 10;``        ``Console.WriteLine(sum(l, r));``    ``}``}` `// This code is contributed``// by Akanksha Rai(Abby_akku)`

## PHP

 ``

## Javascript

 ``
Output:
`17`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live

My Personal Notes arrow_drop_up