#45493: python思路+題解 高中生解


chenwei980503@gmail.com (陳維(Z))

學校 : 新北市立北大高級中學
編號 : 278351
來源 : [101.12.86.8]
最後登入時間 :
2025-04-05 14:32:44
a671. 00113 - Power of Cryptography -- UVa113 | From: [49.216.162.165] | 發表日期 : 2025-03-09 11:51

while True:
try:
n = int(input())
p = int(input())
left = 1
right = p
while left <= right:
mid = (left + right) // 2
power = mid ** n
if power == p:
print(mid)
break
elif power < p:
left = mid + 1
else:
right = mid - 1
except:
break
'''
**為什麼二分搜尋法適用於這個問題?
1. 範圍明確:
(1) 我們知道 k 的範圍是 1≤k≤10**9,這是一個明確的範圍。
(2) 二分搜尋法需要在一個有序範圍內進行搜尋,而這個範圍已經滿足條件。
2. 單調性:
(1) 函數 f(k)=k**n 是一個單調遞增函數,也就是說,當 k 增加時,k**n 也會增加。
(2) 這種單調性使得二分搜尋法可以有效地縮小搜尋範圍。
3. 高效性:
(1) 二分搜尋法的時間複雜度是 O(log N),其中 N 是搜尋範圍的大小。
(2) 在這個問題中,N=10**9,所以最多只需要 log2(10**9)≈30 次迭代就能找到答案,非常高效。

**二分搜尋法與問題的關聯
1. 問題轉化:
(1)我們需要找到一個整數 k,使得 k**n=p。
(2)這可以轉化為在範圍 [1,p] 內搜尋一個滿足 k**n=p 的 k。
2. 搜尋過程:
(1) 初始化搜尋範圍:left = 1,right = p。
(2) 計算中間值 mid = (left + right) // 2。
(3) 計算 mid ** n 並與 p 比較:
。如果 mid ** n == p,則找到答案 k=mid。
。如果 mid ** n < p,則答案在右半部分,更新 left = mid + 1。
。如果 mid ** n > p,則答案在左半部分,更新 right = mid - 1。
(4) 重複上述過程,直到找到答案。

**為什麼不用暴力搜尋?
(1) 如果使用暴力搜尋(從 k=1 開始逐一嘗試),時間複雜度會是 O(k)
,在最壞情況下需要嘗試 10**9 次,效率太低。
(2) 二分搜尋法將時間複雜度降低到 O(log k),大大提升了效率。

**舉例說明
假設 n=2,p=16,我們需要找到 k 使得 k**2=16。
1. 初始化範圍:
。left = 1,right = 16。
2. 第一次迭代:
。mid = (1 + 16) // 2 = 8。
。計算 8**2=64。
。因為 64>16,所以更新 right = mid - 1 = 7。
3. 第二次迭代:
。mid = (1 + 7) // 2 = 4。
。計算 4**2=16。
。因為 16==16,所以找到答案 k=4。
'''

 
ZeroJudge Forum