题解 | 幂次进近

幂次进近

https://www.nowcoder.com/practice/1eda6676a6e544838263d8de9a8f3eed

可能不是正解!

由于k>=1,n-pow(m, k)显然单调,于是想着二分查找第一个n-pow(m, k)大于0的m,然后比较此时二分结束的l和l - 1,答案m一定在这两之中

用Python写就不需要实现高精度了,记得用PyPy3解释器,Python3解释器太慢了

import sys

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

def quick_power(a, b):
  res = 1
  while b != 0:
    if b & 1:
      res *= a
    a = a * a
    b //= 2
  return res

ans = []
t = int(input())
for i in range(t):
  n, k = map(int, input().split())
  if k == 1:
    ans.append(n)
    continue
  elif k >= 65:
    ans.append(1)
    continue
  
  l, r = 1, 10 ** 9
  while l < r:
    mid = (l + r) // 2
    if n - quick_power(mid, k) > 0:
      l = mid + 1
    else:
      r = mid
  
  if abs(n - quick_power(l - 1, k)) < abs(n - quick_power(l, k)):
    ans.append(l - 1)
  else:
    ans.append(l)

print("\n".join(map(str, ans)))

全部评论
我觉得是一种很好的方法Orz
1 回复 分享
发布于 02-04 00:42 山东
大佬,用c++写的话要怎么处理pow的溢出问题?直接在pow里面判断大于1e18就直接返回吗?
点赞 回复 分享
发布于 02-04 13:33 浙江

相关推荐

评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务