Find maximum operations to reduce N to 1
Given two numbers A and B ( A and B can be up to 106 ) which forms a number N = (A!/B!). The task is to reduce N to 1 by performing maximum number of operations possible.
In each operation, one can replace N with N/X if N is divisible by X.
Find the maximum number of operations that can be possible.
Examples:
Input : A = 6, B = 3
Output : 5
Explanation : N is 120 and the divisors are 2, 2, 2, 3, 5
Input : A = 2, B = 1
Output : 1
Explanation : N is 2 and the divisor is 2.
Observe that factorization of number A!/B! is this same as factorization of numbers (B + 1)*(B + 2)*…*(A – 1)*A.
Also, the number of operations will be maximum if we divide N with only with it’s prime factors. So, in other words we need to find the count of prime factors of N including duplicates.
Let’s count the number of prime factors in the factorization of every number from 2 to 1000000.
First, use Sieve of Eratosthenes to find a prime divisor of each of these numbers. Then we can calculate the number of prime factors in the factorization of a using the formula:
primefactors[num] = primefactors[num / primediviser[num]] + 1
Now, one can use prefix sum array for prime factors and then answer for the sum on an interval [A, B].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
int primeFactors[N];
void findPrimeFactors()
{
for ( int i = 2; i < N; i++)
if (primeFactors[i] == 0)
for ( int j = i; j < N; j += i)
primeFactors[j] = primeFactors[j / i] + 1;
for ( int i = 1; i < N; i++)
primeFactors[i] += primeFactors[i - 1];
}
int main()
{
findPrimeFactors();
int a = 6, b = 3;
cout << primeFactors[a] - primeFactors[b];
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int N= 1000005 ;
static int primeFactors[] = new int [N];
static void findPrimeFactors()
{
for ( int i = 2 ; i < N; i++)
if (primeFactors[i] == 0 )
for ( int j = i; j < N; j += i)
primeFactors[j] = primeFactors[j / i] + 1 ;
for ( int i = 1 ; i < N; i++)
primeFactors[i] += primeFactors[i - 1 ];
}
public static void main (String[] args)
{
findPrimeFactors();
int a = 6 , b = 3 ;
System.out.println (primeFactors[a] -
primeFactors[b]);
}
}
|
Python3
N = 1000005
primeFactors = [ 0 ] * N;
def findPrimeFactors() :
for i in range ( 2 , N) :
if (primeFactors[i] = = 0 ) :
for j in range (i, N, i) :
primeFactors[j] = primeFactors[j / / i] + 1 ;
for i in range ( 1 , N) :
primeFactors[i] + = primeFactors[i - 1 ];
if __name__ = = "__main__" :
findPrimeFactors();
a = 6 ; b = 3 ;
print (primeFactors[a] - primeFactors[b]);
|
C#
using System;
class GFG
{
static int N = 1000005;
static int []primeFactors = new int [N];
static void findPrimeFactors()
{
for ( int i = 2; i < N; i++)
if (primeFactors[i] == 0)
for ( int j = i; j < N; j += i)
primeFactors[j] = primeFactors[j / i] + 1;
for ( int i = 1; i < N; i++)
primeFactors[i] += primeFactors[i - 1];
}
static public void Main ()
{
findPrimeFactors();
int a = 6, b = 3;
Console.WriteLine(primeFactors[a] -
primeFactors[b]);
}
}
|
PHP
<?php
$N = 10005;
$primeFactors = array_fill (0, $N , 0);
function findPrimeFactors()
{
global $N , $primeFactors ;
for ( $i = 2; $i < $N ; $i ++)
if ( $primeFactors [ $i ] == 0)
for ( $j = $i ; $j < $N ; $j += $i )
$primeFactors [ $j ] = $primeFactors [(int)( $j / $i )] + 1;
for ( $i = 1; $i < $N ; $i ++)
$primeFactors [ $i ] += $primeFactors [ $i - 1];
}
findPrimeFactors();
$a = 6;
$b = 3;
print (( $primeFactors [ $a ] - $primeFactors [ $b ]));
?>
|
Javascript
<script>
let N = 1000005;
let primeFactors = new Array(N);
primeFactors.fill(0);
function findPrimeFactors()
{
for (let i = 2; i < N; i++)
if (primeFactors[i] == 0)
for (let j = i; j < N; j += i)
primeFactors[j] = primeFactors[parseInt(j / i, 10)] + 1;
for (let i = 1; i < N; i++)
primeFactors[i] += primeFactors[i - 1];
}
findPrimeFactors();
let a = 6, b = 3;
document.write(primeFactors[a] -
primeFactors[b]);
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(N)
Last Updated :
23 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...