思路:数学题,主要是精度和特判。第一个特判就是,此时令
得到结果为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))

京公网安备 11010502036488号