Cho mảng nums và p. Xóa 1 mảng con (không phải toàn bộ) sao cho tổng phần còn lại chia hết cho p. Tìm độ dài mảng con nhỏ nhất cần xóa, -1 nếu không thể.
Ví dụ: nums=[8,2,6,5,3], p=7 → 1. Xóa [3], tổng còn lại = 21 chia hết 7.
Giải thuật (Prefix sum + Hash map)
s = sum(nums) % p. Nếus == 0: trả về 0.- Cần xóa mảng con có tổng ≡
s (mod p). - Duyệt tính prefix sum
cum,r = cum % p. - Map
d[r] = indexlưu chỉ số cuối cùng có prefix mod = r. - Tìm
(r - s) % ptrongd: độ dài =i - d[(r-s)%p], cập nhật min. - Trả về min nếu < n else -1.
Ví dụ minh họa
def solve(nums, p):
ans = float("inf")
s = sum(nums) % p
d = {0: -1}
cum = 0
if s == 0:
return 0
for i in range(len(nums)):
cum += nums[i]
r = cum % p
if (r - s) % p in d:
ans = min(ans, i - d[(r - s) % p])
d[r] = i
return ans if ans < len(nums) else -1
nums = [8,2,6,5,3]
p = 7
print(solve(nums, p))
Đầu vào
[8,2,6,5,3], 7
Đầu ra
1