思路:数学题,主要是精度和特判。第一个特判就是,此时令得到结果为0,这就是最小了;第二个特判就不好想了,当时,我们直接输出1即可,为什么?因为当时,对于来说,会超过题目的,并且差距会越来越大,所以说为了得到最小的结果,m只能取1

然后就可以直接算根了,为什么?因为题目给的是先减后增的,我们也可以在desmos里画图看一下。算出根之后,为了保证精度,我们取为半径,得到,然后算邻域范围内,能够取到最小函数值的自变量x,那就是答案了。

最后还是那个道理,对于多测来说要用一个out数组来记录所有答案,然后再一次print输出,会更快,因为python的print很花时间

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

out = []

def solve():
    n, k = MII()

    if k == 1: # 特判1
        out.append(str(n))
        return

    if k > 60: # 超绝特判2
        out.append('1')
        return

    # 直接算根,然后在[left, right]中找ans
    mid = int(pow(n, 1 / k))
    left = fmax(1, mid - 5)
    right = mid + 5

    ans = 0
    mn = inf
    for x in range(left, right):
        l, r = x, x + 1
        l_val, r_val = abs(n - pow(l, k)), abs(n - pow(r, k))
        
        diff = l_val - r_val
        if diff < 0 and l_val < mn:
            ans = l
            mn = l_val
        elif diff > 0 and r_val < mn:
            ans = r
            mn = r_val

    out.append(str(ans))

# t = 1
t = II()
for _ in range(t):
    solve()

print('\n'.join(out))