Product of all primes in the range from L to R
Given a range [L, R]. The task is to find the product of all the prime numbers in the given range from L to R both inclusive modulo 10^9 + 7.
Examples:
Input: L = 10, R = 20
Output: 46189
Prime numbers between [10, 20] are:
11, 13, 17, 19
Therefore, product = 11 * 13 * 17 * 19 = 46189
Input: L = 15, R = 25
Output: 7429
A Simple Solution is to traverse from L to R, check if the current number is prime. If yes, multiply it with product. Finally, print the product.
An Efficient Solution is to use Sieve of Eratosthenes to find all primes up to a given limit. Then, compute a prefix product array to store product till every value before the limit. Once we have prefix array, We just need to return (prefix[R] *modular_inverse( prefix[L-1]))%(10^9+7).
Note: prefix[i] will store the product of all prime numbers from 1 to i.
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
const int MAX = 10000;
int prefix[MAX + 1];
void buildPrefix()
{
bool prime[MAX + 1];
memset (prime, true , sizeof (prime));
for ( int p = 2; p * p <= MAX; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= MAX; i += p)
prime[i] = false ;
}
}
prefix[0] = prefix[1] = 1;
for ( int p = 2; p <= MAX; p++) {
prefix[p] = prefix[p - 1];
if (prime[p])
prefix[p] = (prefix[p] * p) % mod;
}
}
long long int power( long long int x, long long int y, int p)
{
long long int res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
long long int inverse( long long int n)
{
return power(n, mod - 2, mod);
}
long long int productPrimeRange( int L, int R)
{
return (prefix[R] * inverse(prefix[L - 1])) % mod;
}
int main()
{
buildPrefix();
int L = 10, R = 20;
cout << productPrimeRange(L, R) << endl;
return 0;
}
|
C
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#define mod 1000000007
const int MAX = 10000;
void buildPrefix( int prefix[])
{
bool prime[MAX + 1];
memset (prime, true , sizeof (prime));
for ( int p = 2; p * p <= MAX; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= MAX; i += p)
prime[i] = false ;
}
}
prefix[0] = prefix[1] = 1;
for ( int p = 2; p <= MAX; p++) {
prefix[p] = prefix[p - 1];
if (prime[p])
prefix[p] = (prefix[p] * p) % mod;
}
}
long long int power( long long int x, long long int y, int p)
{
long long int res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
long long int inverse( long long int n)
{
return power(n, mod - 2, mod);
}
long long int productPrimeRange( int L, int R, int prefix[])
{
return (prefix[R] * inverse(prefix[L - 1])) % mod;
}
int main()
{
int prefix[MAX + 1];
buildPrefix(prefix);
int L = 10, R = 20;
printf ( "%lld" , productPrimeRange(L, R, prefix));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int mod = 1000000007 ;
static int MAX = 10000 ;
static int [] prefix = new int [MAX + 1 ];
static void buildPrefix()
{
boolean prime[] = new boolean [MAX + 1 ];
for ( int i = 0 ; i < MAX + 1 ; i++)
prime[i] = true ;
for ( int p = 2 ; p * p <= MAX; p++) {
if (prime[p] == true ) {
for ( int i = p * 2 ; i <= MAX; i += p)
prime[i] = false ;
}
}
prefix[ 0 ] = prefix[ 1 ] = 1 ;
for ( int p = 2 ; p <= MAX; p++) {
prefix[p] = prefix[p - 1 ];
if (prime[p])
prefix[p] = (prefix[p] * p) % mod;
}
}
static long power( long x, long y, int p)
{
long res = 1 ;
x = x % p;
while (y > 0 ) {
if ((y & 1 ) > 0 )
res = (res * x) % p;
y = y >> 1 ;
x = (x * x) % p;
}
return res;
}
static long inverse( long n)
{
return power(n, mod - 2 , mod);
}
static long productPrimeRange( int L, int R)
{
return (prefix[R] * inverse(prefix[L - 1 ])) % mod;
}
public static void main(String[] args)
{
buildPrefix();
int L = 10 , R = 20 ;
System.out.println(productPrimeRange(L, R));
}
}
|
Python 3
mod = 1000000007
MAX = 10000
prefix = [ 0 ] * ( MAX + 1 )
def buildPrefix():
prime = [ True ] * ( MAX + 1 )
p = 2
while p * p < = MAX :
if (prime[p] = = True ) :
for i in range ( p * 2 , MAX + 1 , p):
prime[i] = False
p + = 1
prefix[ 0 ] = prefix[ 1 ] = 1
for p in range ( 2 , MAX + 1 ) :
prefix[p] = prefix[p - 1 ]
if (prime[p]):
prefix[p] = (prefix[p] * p) % mod
def power(x, y,p):
res = 1
x = x % p
while (y > 0 ) :
if (y & 1 ):
res = (res * x) % p
y = y >> 1
x = (x * x) % p
return res
def inverse( n):
return power(n, mod - 2 , mod)
def productPrimeRange(L, R):
return (prefix[R] * inverse(prefix[L - 1 ])) % mod
if __name__ = = "__main__" :
buildPrefix()
L = 10
R = 20
print (productPrimeRange(L, R))
|
C#
using System;
class GFG
{
static int mod = 1000000007;
static int MAX = 10000;
static int []prefix = new int [MAX + 1];
static void buildPrefix()
{
bool []prime = new bool [MAX + 1];
for ( int i = 0; i < MAX + 1; i++)
prime[i] = true ;
for ( int p = 2; p * p <= MAX; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2; i <= MAX; i += p)
prime[i] = false ;
}
}
prefix[0] = prefix[1] = 1;
for ( int p = 2; p <= MAX; p++)
{
prefix[p] = prefix[p - 1];
if (prime[p])
prefix[p] = (prefix[p] * p) % mod;
}
}
static long power( long x, long y, int p)
{
long res = 1;
x = x % p;
while (y > 0)
{
if ((y & 1) > 0)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
static long inverse( long n)
{
return power(n, mod - 2, mod);
}
static long productPrimeRange( int L, int R)
{
return (prefix[R] *
inverse(prefix[L - 1])) % mod;
}
public static void Main ()
{
buildPrefix();
int L = 10, R = 20;
Console.WriteLine(productPrimeRange(L, R));
}
}
|
Javascript
<script>
var mod = 100000007
var MAX = 10000;
var prefix = Array(MAX+1);
function buildPrefix()
{
var prime = Array(MAX+1).fill( true );
for ( var p = 2; p * p <= MAX; p++) {
if (prime[p] == true ) {
for ( var i = p * 2; i <= MAX; i += p)
prime[i] = false ;
}
}
prefix[0] = prefix[1] = 1;
for ( var p = 2; p <= MAX; p++) {
prefix[p] = prefix[p - 1];
if (prime[p])
prefix[p] = (prefix[p] * p) % mod;
}
}
function power(x, y, p)
{
var res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
function inverse( n)
{
return power(n, mod - 2, mod);
}
function productPrimeRange(L, R)
{
return (prefix[R] * inverse(prefix[L - 1])) % mod;
}
buildPrefix();
var L = 10, R = 20;
document.write( productPrimeRange(L, R));
</script>
|
Last Updated :
28 Apr, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...