Minimise N such that sum of count of all factors upto N is greater than or equal to X
Last Updated :
26 Apr, 2023
Given a number X, the task is to find the minimum number N such that the sum of the count of all factors from 1 to N is greater than equal to X.
Examples:
Input: X = 10
Output: 5
Explanation:
Total factors of 1 = 1 (1)
Total factors of 2 = 2 (1, 2)
Total factors of 3 = 2 (1, 3)
Total factors of 4 = 3 (1, 2, 4)
Total factors of 5 = 2 (1, 5)
Total count = 1 + 2 + 2 + 3 + 2 = 10 which is greater than or equal to X i.e., 10
Input: X = 19
Output: 8
Explanation:
Total factors of 1 = 1 (1)
Total factors of 2 = 2 (1, 2)
Total factors of 3 = 2 (1, 3)
Total factors of 4 = 3 (1, 2, 4)
Total factors of 5 = 2 (1, 5)
Total factors of 6 = 2 (1, 2, 3, 6)
Total factors of 7 = 2 (1, 7)
Total factors of 8 = 2 (1, 2, 4, 8)
Total count = 1 + 2 + 2 + 3 + 2 + 4 + 2 + 4 = 20 which is greater than or equal to X i.e., 19
Naive Approach: The naive approach is to run a loop starting from 1 until the total count of factor is greater than equal to X.
Algorithm:
- Define a macro MAX as 1000050 and a type alias ‘lli’ for long int.
- Define a function CountFactors that takes a long integer ‘N’ as input and returns the count of total factors of ‘N’.
- Inside the CountFactors function, initialize a variable ‘cnt’ to zero.
- Run a loop from i=1 to i*i <= N and check if N is divisible by i without leaving a remainder. If yes, increment cnt by 1. If N/i is not equal to i, increment cnt by 1 again.
- Return the value of cnt as the count of total factors of N.
- Define another function minN that takes a long integer ‘X’ as input and returns the lowest number ‘N’ for which the sum of total factors of all numbers from 1 to N is greater than or equal to X.
- Inside the minN function, initialize a variable ‘i’ to 1 and a variable ‘total’ to 0.
- Run a loop until a condition is met that will break the loop. Inside the loop, add the count of total factors of ‘i’ returned by CountFactors function to the variable ‘total’.
- If ‘total’ is greater than or equal to ‘X’, return the current value of ‘i’ as the lowest number ‘N’ satisfying the given condition.
- If ‘total’ is less than ‘X’, increment ‘i’ by 1 and continue with the loop until the condition is met.
- In the main function, define a long integer ‘X’ and initialize it to 10.
- Call the minN function with ‘X’ as input and print the returned value.
- End the program.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000050
#define lli long int
lli CountFactors(lli N)
{
lli cnt = 0;
for (lli i = 1;
i * i <= N; i++) {
if (N % i == 0)
cnt += ((N / i == i) ? 1 : 2);
}
return cnt;
}
lli minN(lli X)
{
lli i = 1;
lli total = 0;
while (1) {
total = total + CountFactors(i);
if (total >= X)
return i;
i++;
}
}
int main()
{
lli X = 10;
cout << minN(X) << endl;
return 0;
}
|
Java
class GFG{
static final int MAX = 1000050 ;
static int CountFactors( int N)
{
int cnt = 0 ;
for ( int i = 1 ; i * i <= N; i++)
{
if (N % i == 0 )
cnt += ((N / i == i) ? 1 : 2 );
}
return cnt;
}
static int minN( int X)
{
int i = 1 ;
int total = 0 ;
while ( true )
{
total = total + CountFactors(i);
if (total >= X)
return i;
i++;
}
}
public static void main(String[] args)
{
int X = 10 ;
System.out.print(minN(X) + "\n" );
}
}
|
Python3
MAX = 1000050
def CountFactors(N):
cnt = 0
i = 1
while i * i < = N:
if (N % i = = 0 ):
if (N / / i = = i):
cnt + = 1
else :
cnt + = 2
i + = 1
return cnt
def minN(X):
i = 1
total = 0
while ( 1 ):
total = total + CountFactors(i)
if (total > = X):
return i
i + = 1
if __name__ = = "__main__" :
X = 10
print ( minN(X))
|
C#
using System;
class GFG{
static int CountFactors( int N)
{
int cnt = 0;
for ( int i = 1; i * i <= N; i++)
{
if (N % i == 0)
cnt += ((N / i == i) ? 1 : 2);
}
return cnt;
}
static int minN( int X)
{
int i = 1;
int total = 0;
while ( true )
{
total = total + CountFactors(i);
if (total >= X)
return i;
i++;
}
}
public static void Main(String[] args)
{
int X = 10;
Console.Write(minN(X) + "\n" );
}
}
|
Javascript
<script>
function CountFactors(N)
{
var cnt = 0;
for (i = 1; i * i <= N; i++)
{
if (N % i == 0)
cnt += ((N / i == i) ? 1 : 2);
}
return cnt;
}
function minN(X)
{
var i = 1;
var total = 0;
while ( true )
{
total = total + CountFactors(i);
if (total >= X)
return i;
i++;
}
}
var X = 10;
document.write(minN(X) + "\n" );
</script>
|
Time Complexity: O(N*sqrt(N))
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized by doing some precomputation. Below are the steps:
- Calculate and store the smallest prime factor of each number (SPF) using the approach discussed in this article.
- Find the count of factors of N efficiently, using Sieve of Eratosthenes and the above calculated smallest prime factor.
- Create a prefix sum array to store the sum of the count of factors from 1 to MAX.
- To find the lowest N such that the above condition satisfied, instead of linear search in prefix array perform a binary search on the prefix sum array (as the prefix sum array will be in increasing order), so that time complexity will be optimal for multiple queries also.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000050
#define lli long int
lli spf[MAX + 1];
void calculate_SPF()
{
for (lli i = 0; i <= MAX; i++)
spf[i] = i;
for (lli i = 4; i <= MAX; i += 2)
spf[i] = 2;
for (lli i = 3;
i * i <= MAX; i++) {
if (spf[i] == i) {
for ( int j = i * i;
j <= MAX; j += i)
if (spf[j] == j)
spf[j] = i;
}
}
}
lli tfactor[MAX + 1];
lli pre[MAX + 1];
void CountTotalfactors()
{
tfactor[1] = pre[1] = 1;
for (lli i = 2; i <= MAX; i++) {
lli mspf = spf[i];
lli prim = mspf;
lli temp = i;
lli cnt = 0;
while (temp % mspf == 0) {
temp /= mspf;
cnt += 1;
prim = prim * mspf;
}
tfactor[i] = (cnt + 1)
* tfactor[temp];
pre[i] = pre[i - 1]
+ tfactor[i];
}
}
lli BinarySearch(lli X)
{
lli start = 1;
lli end = MAX - 1;
while (start < end) {
lli mid = (start + end) / 2;
if (pre[mid] == X)
return mid;
else if (pre[mid] < X)
start = mid + 1;
else
end = mid;
}
return start;
}
void findSumOfCount( int X)
{
calculate_SPF();
CountTotalfactors();
cout << BinarySearch(X)
<< endl;
}
int main()
{
int X = 10;
findSumOfCount(X);
return 0;
}
|
Java
import java.util.*;
class GFG{
static final int MAX = 1000050 ;
static int []spf = new int [MAX + 1 ];
static void calculate_SPF()
{
for ( int i = 0 ; i <= MAX; i++)
spf[i] = i;
for ( int i = 4 ; i <= MAX; i += 2 )
spf[i] = 2 ;
for ( int i = 3 ; i * i <= MAX; i++)
{
if (spf[i] == i)
{
for ( int j = i * i;
j <= MAX; j += i)
if (spf[j] == j)
spf[j] = i;
}
}
}
static int []tfactor = new int [MAX + 1 ];
static int []pre = new int [MAX + 1 ];
static void CountTotalfactors()
{
tfactor[ 1 ] = pre[ 1 ] = 1 ;
for ( int i = 2 ; i <= MAX; i++)
{
int mspf = spf[i];
int prim = mspf;
int temp = i;
int cnt = 0 ;
while (temp % mspf == 0 )
{
temp /= mspf;
cnt += 1 ;
prim = prim * mspf;
}
tfactor[i] = (cnt + 1 ) * tfactor[temp];
pre[i] = pre[i - 1 ] + tfactor[i];
}
}
static int BinarySearch( int X)
{
int start = 1 ;
int end = MAX - 1 ;
while (start < end)
{
int mid = (start + end) / 2 ;
if (pre[mid] == X)
return mid;
else if (pre[mid] < X)
start = mid + 1 ;
else
end = mid;
}
return start;
}
static void findSumOfCount( int X)
{
calculate_SPF();
CountTotalfactors();
System.out.print(BinarySearch(X) + "\n" );
}
public static void main(String[] args)
{
int X = 10 ;
findSumOfCount(X);
}
}
|
Python3
MAX = 1000050
spf = [ 0 for i in range ( MAX + 1 )]
def calculate_SPF():
for i in range ( MAX + 1 ):
spf[i] = i;
for i in range ( 4 , MAX + 1 , 2 ):
spf[i] = 2 ;
i = 3
while (i * i < = MAX ):
if (spf[i] = = i)
j = i * i
while (j < = MAX ):
if (spf[j] = = j):
spf[j] = i;
j + = i
i + = 1
tfactor = [ 0 for i in range ( MAX + 1 )]
pre = [ 0 for i in range ( MAX + 1 )]
def CountTotalfactors():
tfactor[ 1 ] = pre[ 1 ] = 1 ;
for i in range ( 2 , MAX + 1 ):
mspf = spf[i];
prim = mspf;
temp = i;
cnt = 0 ;
while (temp % mspf = = 0 ):
temp / / = mspf;
cnt + = 1 ;
prim = prim * mspf;
tfactor[i] = (cnt + 1 ) *
tfactor[temp];
pre[i] = pre[i - 1 ] +
tfactor[i];
def BinarySearch(X):
start = 1 ;
end = MAX - 1 ;
while (start < end):
mid = (start + end) / / 2 ;
if (pre[mid] = = X):
return mid;
elif (pre[mid] < X):
start = mid + 1 ;
else :
end = mid;
return start;
def findSumOfCount(X):
calculate_SPF();
CountTotalfactors();
print (BinarySearch(X))
if __name__ = = "__main__" :
X = 10 ;
findSumOfCount(X);
|
C#
using System;
class GFG{
const int MAX = 1000050;
static int []spf = new int [MAX + 1];
static void calculate_SPF()
{
for ( int i = 0; i <= MAX; i++)
spf[i] = i;
for ( int i = 4; i <= MAX; i += 2)
spf[i] = 2;
for ( int i = 3; i * i <= MAX; i++)
{
if (spf[i] == i)
{
for ( int j = i * i;
j <= MAX; j += i)
if (spf[j] == j)
spf[j] = i;
}
}
}
static int []tfactor = new int [MAX + 1];
static int []pre = new int [MAX + 1];
static void CountTotalfactors()
{
tfactor[1] = pre[1] = 1;
for ( int i = 2; i <= MAX; i++)
{
int mspf = spf[i];
int prim = mspf;
int temp = i;
int cnt = 0;
while (temp % mspf == 0)
{
temp /= mspf;
cnt += 1;
prim = prim * mspf;
}
tfactor[i] = (cnt + 1) * tfactor[temp];
pre[i] = pre[i - 1] + tfactor[i];
}
}
static int BinarySearch( int X)
{
int start = 1;
int end = MAX - 1;
while (start < end)
{
int mid = (start + end) / 2;
if (pre[mid] == X)
return mid;
else if (pre[mid] < X)
start = mid + 1;
else
end = mid;
}
return start;
}
static void findSumOfCount( int X)
{
calculate_SPF();
CountTotalfactors();
Console.Write(BinarySearch(X) + "\n" );
}
public static void Main()
{
int X = 10;
findSumOfCount(X);
}
}
|
Javascript
<script>
var MAX = 1000050;
var spf = Array(MAX+1);
function calculate_SPF()
{
for ( var i = 0; i <= MAX; i++)
spf[i] = i;
for ( var i = 4; i <= MAX; i += 2)
spf[i] = 2;
for ( var i = 3;
i * i <= MAX; i++) {
if (spf[i] == i) {
for ( var j = i * i;
j <= MAX; j += i)
if (spf[j] == j)
spf[j] = i;
}
}
}
var tfactor = Array(MAX+1);
var pre = Array(MAX+1);
function CountTotalfactors()
{
tfactor[1] = pre[1] = 1;
for ( var i = 2; i <= MAX; i++) {
var mspf = spf[i];
var prim = mspf;
var temp = i;
var cnt = 0;
while (temp % mspf == 0) {
temp = parseInt(temp/mspf);
cnt += 1;
prim = prim * mspf;
}
tfactor[i] = (cnt + 1)
* tfactor[temp];
pre[i] = pre[i - 1]
+ tfactor[i];
}
}
function BinarySearch(X)
{
var start = 1;
var end = MAX - 1;
while (start < end) {
var mid = parseInt((start + end) / 2);
if (pre[mid] == X)
return mid;
else if (pre[mid] < X)
start = mid + 1;
else
end = mid;
}
return start;
}
function findSumOfCount( X)
{
calculate_SPF();
CountTotalfactors();
document.write( BinarySearch(X) + "<br>" );
}
var X = 10;
findSumOfCount(X);
</script>
|
Time Complexity: O(MAX*log(MAX))
Auxiliary Space: O(MAX)
Note: If there are Q queries, then the time complexity of finding N for all the Q queries will be O(Q*log(MAX)).
Share your thoughts in the comments
Please Login to comment...