When submitting a solution in C++, please select either C++14 (GCC 6-32) or C++17 (GCC 7-32) as your compiler. ×

im__skp's blog

By im__skp, history, 3 years ago, In English

I was doing a problem in which you are given a number P and a number N. You have to find a number K such that K^N is equal to P.

CONSTRAINTS ARE : 1 ≤ n ≤ 200, 1 ≤ p < 10^101

PROBLEM LINK

The python code that got AC :

while True:
    try:
        n = int(input())
        p = int(input())
        print(round(p**(1/n)))

    except:
        break

Why do I have to use the round function why can't I use ceil or floor?

When should I use round?

These kinds of questions cost me a lot of WAs. Can someone tell me how to deal with these kinds of questions?

  • Vote: I like it
  • +3
  • Vote: I do not like it

| Write comment?
»
3 years ago, # |
Rev. 2   Vote: I like it +3 Vote: I do not like it

My guess would be that round is more accurate than ceil or floor since round rounds to the nearest integer. However, to be safe, I wouldn't use round or any floating-points here at all. Instead, you should do binary search on k in order to find the exact integer answer. This requires using big integers, but big integers are built into Python anyway and it does not give you the precision problems that floating-points will give you.

import sys

# I/O boilerplate:
lines = (line for line in sys.stdin.read().split("\n"))
def next_int():
    next_line = next(lines)
    # Exit once we hit empty line
    if next_line == "":
        sys.exit(0)
    return int(next_line)

while True:
    n = next_int()
    p = next_int()
    
    min_possible_value_of_k = 1
    max_possible_value_of_k = 10**9
    # This is the part where we do binary search on k:
    while min_possible_value_of_k <= max_possible_value_of_k:
        mid = (min_possible_value_of_k + max_possible_value_of_k) // 2
        mid_to_nth_power = mid**n
        
        if mid_to_nth_power == p:
            print(mid)
            break
        elif mid_to_nth_power < p:
            min_possible_value_of_k = mid + 1
        else:
            max_possible_value_of_k = mid - 1