Given an integer N, the task is to find the sum of semi-prime numbers which are less than or equal to N. A Semi prime number is a number that is a multiple of two prime numbers.
Examples:
Input: N = 6
Output: 10
4 and 6 are the semi primes ? 6
4 + 6 = 10
Input: N = 10000000
Output: 9322298311255
Approach:
- First Calculate the primes less than or equal to N using Sieve and store them in a vector in sorted order.
- Iterate over the vector of primes. Fix one of the primes and starting checking the value of the product of all primes with this fixed prime.
- As the primes are arranged in sorted order, once we find a prime for which the product exceeds N, then it would exceed for all remaining primes. Hence, break the nested loop here.
- Add the product value to the answer variable for all valid pairs.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
#define ll long long int // Vector to store the primes vector<ll> pr; // Create a boolean array "prime[0..n]" bool prime[10000000 + 1];
void sieve(ll n)
{ // Initialize all prime values to be true
for ( int i = 2; i <= n; i += 1) {
prime[i] = 1;
}
for (ll p = 2; (ll)p * (ll)p <= n; p++) {
// If prime[p] is not changed then it is a prime
if (prime[p] == true ) {
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked
for (ll i = (ll)p * (ll)p; i <= n; i += p)
prime[i] = false ;
}
}
// Print all prime numbers
for (ll p = 2; p <= n; p++)
if (prime[p])
pr.push_back(p);
} // Function to return the semi-prime sum ll SemiPrimeSum(ll N) { // Variable to store the sum of semi-primes
ll ans = 0;
// Iterate over the prime values
for ( int i = 0; i < pr.size(); i += 1) {
for ( int j = i; j < pr.size(); j += 1) {
// Break the loop once the product exceeds N
if ((ll)pr[i] * (ll)pr[j] > N)
break ;
// Add valid products which are less than
// or equal to N
// each product is a semi-prime number
ans += (ll)pr[i] * (ll)pr[j];
}
}
return ans;
} // Driver code int main()
{ ll N = 6;
sieve(N);
cout << SemiPrimeSum(N);
return 0;
} |
Java
// Java implementation of the above approach import java.util.*;
class GFG
{ // Vector to store the primes static Vector<Long> pr = new Vector<>();
// Create a boolean array "prime[0..n]" static boolean prime[] = new boolean [ 10000000 + 1 ];
static void sieve( long n)
{ // Initialize along prime values to be true
for ( int i = 2 ; i <= n; i += 1 )
{
prime[i] = true ;
}
for ( int p = 2 ; ( int )p * ( int )p <= n; p++)
{
// If prime[p] is not changed then it is a prime
if (prime[p] == true )
{
// Update along multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked
for ( int i = ( int )p * ( int )p; i <= n; i += p)
prime[i] = false ;
}
}
// Print all prime numbers
for ( int p = 2 ; p <= n; p++)
if (prime[p])
pr.add(( long )p);
} // Function to return the semi-prime sum static long SemiPrimeSum( long N)
{ // Variable to store the sum of semi-primes
long ans = 0 ;
// Iterate over the prime values
for ( int i = 0 ; i < pr.size(); i += 1 )
{
for ( int j = i; j < pr.size(); j += 1 )
{
// Break the loop once the product exceeds N
if (( long )pr.get(i) * ( long )pr.get(j) > N)
break ;
// Add valid products which are less than
// or equal to N
// each product is a semi-prime number
ans += ( long )pr.get(i) * ( long )pr.get(j);
}
}
return ans;
} // Driver code public static void main(String[] args)
{ long N = 6 ;
sieve(N);
System.out.println(SemiPrimeSum(N));
} } // This code is contributed by Princi Singh |
Python3
# Python3 implementation of the approach # Vector to store the primes pr = []
# Create a boolean array "prime[0..n]" prime = [ 1 for i in range ( 10000000 + 1 )]
def sieve(n):
for p in range ( 2 , n):
if p * p > n:
break
# If prime[p] is not changed then it is a prime
if (prime[p] = = True ):
# Update amultiples of p greater than or
# equal to the square of it
# numbers which are multiple of p and are
# less than p^2 are already been marked
for i in range ( 2 * p, n + 1 , p):
prime[i] = False
# Print all prime numbers
for p in range ( 2 , n + 1 ):
if (prime[p]):
pr.append(p)
# Function to return the semi-prime sum def SemiPrimeSum(N):
# Variable to store the sum of semi-primes
ans = 0
# Iterate over the prime values
for i in range ( len (pr)):
for j in range (i, len (pr)):
# Break the loop once the product exceeds N
if (pr[i] * pr[j] > N):
break
# Add valid products which are less than
# or equal to N
# each product is a semi-prime number
ans + = pr[i] * pr[j]
return ans
# Driver code N = 6
sieve(N) print (SemiPrimeSum(N))
# This code is contributed by mohit kumar 29 |
C#
// C# implementation of the above approach using System;
using System.Collections.Generic;
class GFG
{ // Vector to store the primes static List< long > pr = new List< long >();
// Create a boolean array "prime[0..n]" static bool []prime = new bool [10000000 + 1];
static void sieve( long n)
{ // Initialize along prime values to be true
for ( int i = 2; i <= n; i += 1)
{
prime[i] = true ;
}
for ( int p = 2; ( int )p * ( int )p <= n; p++)
{
// If prime[p] is not changed then it is a prime
if (prime[p] == true )
{
// Update along multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked
for ( int i = ( int )p * ( int )p; i <= n; i += p)
prime[i] = false ;
}
}
// Print all prime numbers
for ( int p = 2; p <= n; p++)
if (prime[p])
pr.Add(( long )p);
} // Function to return the semi-prime sum static long SemiPrimeSum( long N)
{ // Variable to store the sum of semi-primes
long ans = 0;
// Iterate over the prime values
for ( int i = 0; i < pr.Count; i += 1)
{
for ( int j = i; j < pr.Count; j += 1)
{
// Break the loop once the product exceeds N
if (( long )pr[i] * ( long )pr[j] > N)
break ;
// Add valid products which are less than
// or equal to N
// each product is a semi-prime number
ans += ( long )pr[i] * ( long )pr[j];
}
}
return ans;
} // Driver code public static void Main(String[] args)
{ long N = 6;
sieve(N);
Console.WriteLine(SemiPrimeSum(N));
} } // This code is contributed by Rajput-Ji |
Javascript
<script> // Javascript implementation of the approach // Vector to store the primes let pr = []; // Create a boolean array "prime[0..n]" let prime = new Array(10000000 + 1);
function sieve(n)
{ // Initialize all prime values to be true
for (let i = 2; i <= n; i += 1) {
prime[i] = 1;
}
for (let p = 2; p * p <= n; p++) {
// If prime[p] is not changed then it is a prime
if (prime[p] == true ) {
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked
for (let i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
// Print all prime numbers
for (let p = 2; p <= n; p++)
if (prime[p])
pr.push(p);
} // Function to return the semi-prime sum function SemiPrimeSum(N)
{ // Variable to store the sum of semi-primes
let ans = 0;
// Iterate over the prime values
for (let i = 0; i < pr.length; i += 1) {
for (let j = i; j < pr.length; j += 1) {
// Break the loop once the product exceeds N
if (pr[i] * pr[j] > N)
break ;
// Add valid products which are less than
// or equal to N
// each product is a semi-prime number
ans += pr[i] * pr[j];
}
}
return ans;
} // Driver code let N = 6;
sieve(N);
document.write(SemiPrimeSum(N));
</script> |
Output:
10
Auxiliary Space: O(10000000)