สมมติว่าเรามีค่า n เราต้องหาจำนวนคู่ (a, b) [a
ดังนั้น หากอินพุตเป็น n =4 เอาต์พุตจะเป็น 2 เนื่องจากคู่ที่ถูกต้องคือ (1, 2) และ (1, 3)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน divisors_gen() นี่จะใช้เวลา n
- divs :=รายการของขนาด n+1 และแต่ละรายชื่อภายในถือ 1
- divs[0] :=รายการที่มีองค์ประกอบเดียว 0
- สำหรับฉันในช่วง 2 ถึง n ทำ
- สำหรับ j ในช่วง 1 ถึงชั้นของ (n / i) + 1, do
- แทรก i ที่ท้ายรายการที่ดัชนี [i * j]
- สำหรับ j ในช่วง 1 ถึงชั้นของ (n / i) + 1, do
- ส่งคืน div แต่กลับรายการภายในทั้งหมด
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- ผลลัพธ์ :=0
- d_cache :=divisors_gen(n+1)
- สำหรับ a ในช่วง 1 ถึง n - 1 ทำ
- ผม :=1
- s :=ชุดใหม่
- ในขณะที่ a*i
- b :=n - a*i
- สำหรับแต่ละ d ใน d_cache[b] ทำ
- ถ้า d> a แล้ว
- ถ้า d ไม่อยู่ใน s แล้ว
- ผลลัพธ์ :=ผลลัพธ์ + 1
- ถ้า d ไม่อยู่ใน s แล้ว
- มิฉะนั้น
- ออกมาจากวงจร
- ใส่ d เข้าไปในชุด s
- ผม :=ผม + 1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def divisors_gen(n):
divs = [[1] for x in range(0, n + 1)]
divs[0] = [0]
for i in range(2, n + 1):
for j in range(1, n // i + 1):
divs[i * j].append(i)
return [i[::-1] for i in divs]
def solve(n):
result = 0
d_cache = divisors_gen(n+1)
for a in range(1, n):
i = 1
s = set([])
while a*i < n:
b = n - a*i
for d in d_cache[b]:
if d > a:
if d not in s:
result += 1
else:
break
s.add(d)
i += 1
return result
n = 4
print(solve(n)) อินพุต
4
ผลลัพธ์
2