Sum of all prime divisors of all the numbers in range L-R
Last Updated :
13 Dec, 2022
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++
#include <iostream>
using namespace std;
bool isPrime( int n)
{
for ( int i = 2; i * i <= n; i++) {
if (n % i == 0)
return false ;
}
return true ;
}
int sum( int l, int r)
{
int sum = 0;
for ( int i = l; i <= r; i++) {
if (isPrime(i))
continue ;
for ( int j = 2; j < i; j++) {
if (i % j == 0 && isPrime(j))
sum += j;
}
}
return sum;
}
int main() {
int l = 18, r = 25;
cout<<(sum(l, r));
return 0;
}
|
Java
class gfg {
static boolean isPrime( int n)
{
for ( int i = 2 ; i * i <= n; i++) {
if (n % i == 0 )
return false ;
}
return true ;
}
static int sum( int l, int r)
{
int sum = 0 ;
for ( int i = l; i <= r; i++) {
if (isPrime(i))
continue ;
for ( int j = 2 ; j < i; j++) {
if (i % j == 0 && isPrime(j))
sum += j;
}
}
return sum;
}
public static void main(String[] args)
{
int l = 18 , r = 25 ;
System.out.println(sum(l, r));
}
}
|
Python3
def isPrime(n):
i = 2
while i * i < = n:
if (n % i = = 0 ):
return False
i + = 1
return True
def sum (l, r):
sum = 0
for i in range (l, r + 1 ) :
if (isPrime(i)) :
continue
for j in range ( 2 , i):
if (i % j = = 0 and isPrime(j)) :
sum + = j
return sum
if __name__ = = "__main__" :
l = 18
r = 25
print ( sum (l, r))
|
C#
using System;
class GFG
{
static bool isPrime( int n)
{
for ( int i = 2;
i * i <= n; i++)
{
if (n % i == 0)
return false ;
}
return true ;
}
static int sum( int l, int r)
{
int sum = 0;
for ( int i = l; i <= r; i++)
{
if (isPrime(i))
continue ;
for ( int j = 2; j < i; j++)
{
if (i % j == 0 && isPrime(j))
sum += j;
}
}
return sum;
}
public static void Main()
{
int l = 18, r = 25;
Console.WriteLine(sum(l, r));
}
}
|
PHP
<?php
function isPrime( $n )
{
for ( $i = 2; $i * $i <= $n ; $i ++)
{
if ( $n % $i == 0)
return false;
}
return true;
}
function sum1( $l , $r )
{
$sum = 0;
for ( $i = $l ; $i <= $r ; $i ++)
{
if (isPrime( $i ))
continue ;
for ( $j = 2; $j < $i ; $j ++)
{
if ( $i % $j == 0 && isPrime( $j ))
$sum += $j ;
}
}
return $sum ;
}
$l = 18;
$r = 25;
echo sum1( $l , $r );
?>
|
Javascript
<script>
function isPrime(n)
{
for (let i = 2; i * i <= n; i++) {
if (n % i == 0)
return false ;
}
return true ;
}
function sum(l,r)
{
let sum = 0;
for (let i = l; i <= r; i++) {
if (isPrime(i))
continue ;
for (let j = 2; j < i; j++) {
if (i % j == 0 && isPrime(j))
sum += j;
}
}
return sum;
}
let l = 18, r = 25;
document.write(sum(l, r));
</script>
|
Time Complexity: O(N * N * sqrt(N))
Auxiliary Space: O(1) as it is using constant space for variables
An efficient approach is to modify the sieve of Eratosthenes slightly to find the 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++
#include<bits/stdc++.h>
using namespace std;
#define N 10000
long arr[N];
void sieve()
{
for ( int i = 2; i * i < N; i++)
{
if (arr[i] == 0)
{
for ( int j = 2; i * j < N; j++)
{
arr[i * j] += i;
}
}
}
}
long sum( int l, int r)
{
sieve();
long pref_arr[r+1];
pref_arr[0] = arr[0];
for ( int i = 1; i <= r; i++) {
pref_arr[i] = pref_arr[i - 1] + arr[i];
}
if (l == 1)
return (pref_arr[r]);
else
return (pref_arr[r] - pref_arr[l - 1]);
}
int main()
{
int l = 5, r = 10;
cout<<(sum(l, r));
return 0;
}
|
Java
public class gfg {
static int N = 10000 ;
static long arr[] = new long [N];
static void sieve()
{
for ( int i = 2 ; i * i < N; i++) {
if (arr[i] == 0 ) {
for ( int j = 2 ; i * j < N; j++) {
arr[i * j] += i;
}
}
}
}
static long sum( int l, int r)
{
sieve();
long [] pref_arr = new long [r + 1 ];
pref_arr[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i <= r; i++) {
pref_arr[i] = pref_arr[i - 1 ] + arr[i];
}
if (l == 1 )
return (pref_arr[r]);
else
return (pref_arr[r] - pref_arr[l - 1 ]);
}
public static void main(String[] args)
{
int l = 5 , r = 10 ;
System.out.println(sum(l, r));
}
}
|
Python3
N = 10000 ;
arr = [ 0 ] * N;
def sieve():
i = 2 ;
while (i * i < N):
if (arr[i] = = 0 ):
j = 2 ;
while (i * j < N):
arr[i * j] + = i;
j + = 1 ;
i + = 1 ;
def sum (l, r):
sieve();
pref_arr = [ 0 ] * (r + 1 );
pref_arr[ 0 ] = arr[ 0 ];
for i in range ( 1 , r + 1 ):
pref_arr[i] = pref_arr[i - 1 ] + arr[i];
if (l = = 1 ):
return (pref_arr[r]);
else :
return (pref_arr[r] -
pref_arr[l - 1 ]);
l = 5 ;
r = 10 ;
print ( sum (l, r));
|
C#
using System;
class GFG
{
static int N = 10000;
static long [] arr = new long [N];
static void sieve()
{
for ( int i = 2; i * i < N; i++)
{
if (arr[i] == 0)
{
for ( int j = 2;
i * j < N; j++)
{
arr[i * j] += i;
}
}
}
}
static long sum( int l, int r)
{
sieve();
long [] pref_arr = new long [r + 1];
pref_arr[0] = arr[0];
for ( int i = 1; i <= r; i++)
{
pref_arr[i] = pref_arr[i - 1] +
arr[i];
}
if (l == 1)
return (pref_arr[r]);
else
return (pref_arr[r] -
pref_arr[l - 1]);
}
public static void Main()
{
int l = 5, r = 10;
Console.WriteLine(sum(l, r));
}
}
|
PHP
<?php
$N = 10000;
$arr = array_fill (0, $N , 0);
function sieve()
{
global $N , $arr ;
for ( $i = 2; $i * $i < $N ; $i ++)
{
if ( $arr [ $i ] == 0)
{
for ( $j = 2; $i * $j < $N ; $j ++)
{
$arr [ $i * $j ] += $i ;
}
}
}
}
function sum( $l , $r )
{
global $arr ;
sieve();
$pref_arr = array_fill (0, $r + 1, 0);
$pref_arr [0] = $arr [0];
for ( $i = 1; $i <= $r ; $i ++)
{
$pref_arr [ $i ] = $pref_arr [ $i - 1] +
$arr [ $i ];
}
if ( $l == 1)
return ( $pref_arr [ $r ]);
else
return ( $pref_arr [ $r ] -
$pref_arr [ $l - 1]);
}
$l = 5;
$r = 10;
echo (sum( $l , $r ));
?>
|
Javascript
<script>
let N = 10000;
let arr= new Array(N);
for (let i=0;i<N;i++)
{
arr[i]=0;
}
function sieve()
{
for (let i = 2; i * i < N; i++) {
if (arr[i] == 0) {
for (let j = 2; i * j < N; j++) {
arr[i * j] += i;
}
}
}
}
function sum(l,r)
{
sieve();
let pref_arr = new Array(r + 1);
pref_arr[0] = arr[0];
for (let i = 1; i <= r; i++) {
pref_arr[i] = pref_arr[i - 1] + arr[i];
}
if (l == 1)
return (pref_arr[r]);
else
return (pref_arr[r] - pref_arr[l - 1]);
}
let l = 5, r = 10;
document.write(sum(l, r));
</script>
|
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...