Cho mảng A chứa GCD của mọi cặp phần tử của một mảng khác, tìm mảng số gốc đã dùng để tính mảng GCD này.
Ví dụ: A = [6, 1, 1, 13] → Kết quả: [13, 6] vì gcd(13,13)=13, gcd(13,6)=1, gcd(6,13)=1, gcd(6,6)=6.
Thuật toán
- Sắp xếp A giảm dần.
- Đếm tần suất xuất hiện của mỗi giá trị.
- Kích thước mảng gốc = √(độ dài A).
- Duyệt A, nếu phần tử còn tần suất > 0: thêm vào kết quả, giảm tần suất, và trừ 2 lần tần suất của GCD với các phần tử đã chọn.
- Trả về các phần tử đầu tiên của kết quả.
Ví dụ code
from math import sqrt, gcd
def get_actual_array(A):
n = len(A)
A.sort(reverse=True)
occurrence = [0] * (A[0] + 1)
for i in range(n):
occurrence[A[i]] += 1
size = int(sqrt(n))
res = [0] * len(A)
l = 0
for i in range(n):
if occurrence[A[i]] > 0:
res[l] = A[i]
occurrence[res[l]] -= 1
l += 1
for j in range(l):
if i != j:
g = gcd(A[i], res[j])
occurrence[g] -= 2
return res[:size]
A = [6, 1, 1, 13]
print(get_actual_array(A))
Input
[6, 1, 1, 13]
Output
[13, 6]