Given the integers a, b, N, the task is to find the largest number x such that
Examples:
Input: a = 2, b = 10, N = 2
Output: 3
Explanation:
Here 2 * 33 = 54, which has the number of digits = 2,
but 2 * 44 = 512 which has a number of digits = 3, which is not equal to N.
Therefore, the largest value of x is 2.Input: a = 1, b = 2, N = 3
Output: 2
Explanation:
1 * 22 = 4 whose binary representation is 100 and it has 3 digits.
Approach: This problem can be solved using binary search.
- The number of digits of
in base is . - Binary search is used to find the largest
such that the number of digits of in base is exactly . - In binary search, we will check the number of digits
, where , and change the pointer according to that.
Below is the implementation of the above approach:
// C++ implementation of the above approach #include <bits/stdc++.h> using namespace std;
// Function to find log_b(a) double log ( int a, int b)
{ return log10 (a) / log10 (b);
} int get( int a, int b, int n)
{ // Set two pointer for binary search
int lo = 0, hi = 1e6;
int ans = 0;
while (lo <= hi) {
int mid = (lo + hi) / 2;
// Calculating number of digits
// of a*mid^mid in base b
int dig = ceil ((mid * log (mid, b)
+ log (a, b)));
if (dig > n) {
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else {
// if number of digits <= n,
// we can go higher to
// reach value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// return the largest value of x
return ans;
} // Driver Code int main()
{ int a = 2, b = 2, n = 6;
cout << get(a, b, n)
<< "\n" ;
return 0;
} |
// Java implementation of the above approach import java.util.*;
class GFG{
// Function to find log_b(a) static int log( int a, int b)
{ return ( int )(Math.log10(a) /
Math.log10(b));
} static int get( int a, int b, int n)
{ // Set two pointer for binary search
int lo = 0 , hi = ( int ) 1e6;
int ans = 0 ;
while (lo <= hi)
{
int mid = (lo + hi) / 2 ;
// Calculating number of digits
// of a*mid^mid in base b
int dig = ( int ) Math.ceil((mid * log(mid, b) +
log(a, b)));
if (dig > n)
{
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1 ;
}
else
{
// If number of digits <= n,
// we can go higher to reach
// value exactly equal to n
ans = mid;
lo = mid + 1 ;
}
}
// Return the largest value of x
return ans;
} // Driver Code public static void main(String[] args)
{ int a = 2 , b = 2 , n = 6 ;
System.out.print(get(a, b, n) + "\n" );
} } // This code is contributed by amal kumar choubey |
# Python3 implementation of the above approach from math import log10,ceil,log
# Function to find log_b(a) def log1(a,b):
return log10(a) / / log10(b)
def get(a,b,n):
# Set two pointer for binary search
lo = 0
hi = 1e6
ans = 0
while (lo < = hi):
mid = (lo + hi) / / 2
# Calculating number of digits
# of a*mid^mid in base b
dig = ceil((mid * log(mid, b) + log(a, b)))
if (dig > n):
# If number of digits > n
# we can simply ignore it
# and decrease our pointer
hi = mid - 1
else :
# if number of digits <= n,
# we can go higher to
# reach value exactly equal to n
ans = mid
lo = mid + 1
# return the largest value of x
return ans
# Driver Code if __name__ = = '__main__' :
a = 2
b = 2
n = 6
print ( int (get(a, b, n)))
# This code is contributed by Surendra_Gangwar |
// C# implementation of the above approach using System;
class GFG{
// Function to find log_b(a) static int log( int a, int b)
{ return ( int )(Math.Log10(a) /
Math.Log10(b));
} static int get ( int a, int b, int n)
{ // Set two pointer for binary search
int lo = 0, hi = ( int ) 1e6;
int ans = 0;
while (lo <= hi)
{
int mid = (lo + hi) / 2;
// Calculating number of digits
// of a*mid^mid in base b
int dig = ( int )Math.Ceiling(( double )(mid *
log(mid, b) +
log(a, b)));
if (dig > n)
{
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else
{
// If number of digits <= n,
// we can go higher to reach
// value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// Return the largest value of x
return ans;
} // Driver Code public static void Main(String[] args)
{ int a = 2, b = 2, n = 6;
Console.Write( get (a, b, n) + "\n" );
} } // This code is contributed by amal kumar choubey |
<script> // Javascript implementation of the above approach // Function to find log_b(a) function log(a, b)
{ return (Math.log10(a) /
Math.log10(b));
} function get(a, b, n)
{ // Set two pointer for binary search
let lo = 0, hi = 1e6;
let ans = 0;
while (lo <= hi)
{
let mid = Math.floor((lo + hi) / 2);
// Calculating number of digits
// of a*mid^mid in base b
let dig = Math.ceil((mid * log(mid, b) +
log(a, b)));
if (dig > n)
{
// If number of digits > n
// we can simply ignore it
// and decrease our pointer
hi = mid - 1;
}
else
{
// If number of digits <= n,
// we can go higher to reach
// value exactly equal to n
ans = mid;
lo = mid + 1;
}
}
// Return the largest value of x
return ans;
} // Driver Code let a = 2, b = 2, n = 6;
document.write(get(a, b, n) + "\n" );
</script> |
Output:
3
Time Complexity: O(log(k)) where k=1e6.
Auxiliary Space: O(1)