📌  相关文章
📜  x的最大值,使得axx是基数b的N位数字

📅  最后修改于: 2021-05-04 20:37:00             🧑  作者: Mango

给定整数abN ,任务是找到最大数x ,使得a*x^{x}是基数b的N位数字。

例子:

方法:可以使用二进制搜索解决此问题。

  • 的位数ax^x在基地b\lceil\log_b{ax^x}\rceil
  • 二进制搜索用于查找最大的x这样的数字ax^x在基地b正是n
  • 在二进制搜索中,我们将检查位数ax^x , 在哪里x = mid ,并据此更改指针。
    \lceil\log_b{ax^x}\rceil = \lceil x*\log_b{x}+\log_b{a} \rceil

下面是上述方法的实现:

C++
// C++ implementation of the above approach
  
#include 
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
// 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
# 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#
// 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


输出:
3