ให้ Array nums และ m หา max(subarray_sum % m)
ตัวอย่าง: nums=[1,5,7,3], m=5 → 3
ขั้นตอน (Prefix Sum + Ordered Set)
- คำนวณ Prefix Sum Modulo
m→csum - Maintain Sorted List
seenของ Prefix ที่ผ่านมา - สำหรับแต่ละ
sในcsum: หาseen[idx] > sแรก (Bisect) → Candidate =(s - seen[idx]) % m - Update Max
ตัวอย่างโค้ด
import bisect
def solve(nums, m):
csum = [nums[0] % m]
for x in nums[1:]:
csum.append((csum[-1] + x) % m)
seen = [0]
max_sum = -1
for s in csum:
idx = bisect.bisect_left(seen, s)
if idx < len(seen):
max_sum = max(max_sum, s, (s - seen[idx]) % m)
else:
max_sum = max(max_sum, s)
bisect.insort_left(seen, s)
return max_sum
nums = [1,5,7,3]
m = 5
print(solve(nums, m)) # Output: 3อินพุต
[1,5,7,3], 5
เอาต์พุต
3