Cho số N, tìm 4 ước số của N có tổng bằng N và tích lớn nhất. Các ước số có thể trùng nhau.
Ví dụ: N=60 → Ước: 1,2,3,4,5,6,10,12,15,20,30,60 → Chọn 15,15,15,15 → Tích=50625.
Thuật toán tối ưu O(d²) với d = số ước
- Tìm tất cả ước số của N lưu vào list
v. - Tính tất cả tổng cặp ước
v[i] + v[j] < N, lưu vàov1và mapmap1[sum] = (v[i], v[j]). - Với mỗi tổng
strongv1, kiểm traN - scó trong map không. Nếu có, lấy 4 ước số tương ứng, tính tích, cập nhật max.
Ví dụ code
from math import sqrt, ceil, floor
def get_product(n):
my_map = {}
v = []
v1 = []
for i in range(1, ceil(sqrt(n)) + 1):
if n % i == 0:
v.append(i)
if i != n // i and i != 1:
v.append(n // i)
s = len(v)
maximum = -1
map1 = [0] * (n + 5)
for i in range(s):
for j in range(i, s):
if v[i] + v[j] < n:
v1.append(v[i] + v[j])
map1[v[i] + v[j]] = [v[i], v[j]]
my_map[v[i] + v[j]] = 1
s = len(v1)
for i in range(s):
element = n - v1[i]
if element in my_map:
a, b = map1[v1[i]]
c, d = map1[element]
maximum = max(a * b * c * d, maximum)
if maximum == -1:
print("Not Possible")
else:
print("Maximum product", maximum)
n = 60
get_product(n)
Input
60
Output
Maximum product 50625