Mô tả bài toán
Cho mảng nums các số dương duy nhất. Đếm số bộ bốn (a,b,c,d) phân biệt sao cho a*b = c*d.
Ví dụ
nums = [2,3,4,6] -> 8 bộ: (2,6,3,4), (2,6,4,3), (6,2,3,4), (6,2,4,3), (3,4,2,6), (4,3,2,6), (3,4,6,2), (4,3,6,2).
Giải thuật
- Đếm tần suất từng tích
nums[i]*nums[j](i < j) vàodic. - Với mỗi tần suất
v >= 2: số bộ bốn =(v-1)/2 * (8 + 8*(v-1))=4*v*(v-1). - Tổng cộng tất cả.
Triển khai Python
from collections import defaultdict
def solve(nums):
dic = defaultdict(int)
ans = 0
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
dic[nums[i] * nums[j]] += 1
for v in dic.values():
if v == 1:
continue
v -= 1
s = (v / 2) * (8 + 8 * v)
ans += s
return int(ans)
nums = [3, 4, 6, 2]
print(solve(nums))
Đầu vào
[3,4,6,2]
Đầu ra
8