একটি অ্যারে nums এবং ইন্টিজার m দেওয়া আছে। যেকোনো সাবঅ্যারের যোগফল মডুলো m-এর সর্বোচ্চ মান বের করুন।
উদাহরণ
nums = [1,5,7,3], m = 5 → আউটপুট: 3
এলগরিদম (প্রিফিক্স সাম + বাইনারি সার্চ)
csum[0] = nums[0] % mfor x in nums[1:]: csum.append((csum[-1]+x) % m)seen := [0](সোর্টেড লিস্ট)- প্রতিটি
sইনcsum:idx := bisect_left(seen, s)- যদি
idx < len(seen):max_sum = max(max_sum, s, (s - seen[idx]) % m) insort_left(seen, s)
max_sumরিটার্ন করুন।
পাইথন কোড
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)) # আউটপুট: 3
ইনপুট / আউটপুট
[1,5,7,3], 5 3