Number of Sub-arrays With Odd Sum

medium array math dp prefix sum

Problem

Given an array of positive integers arr, return the number of subarrays with an odd sum. Because the answer can be very large, return it modulo 10^9 + 7.

Inputarr = [1, 3, 5]
Output4
Odd-sum subarrays: [1], [5], [1,3,5], [3,5].

def num_odd_sum_subarrays(arr):
    MOD = 10**9 + 7
    even, odd = 1, 0  # prefix-sum parity counts (empty prefix is even)
    s = 0; ans = 0
    for x in arr:
        s += x
        if s % 2 == 1:
            ans = (ans + even) % MOD
            odd += 1
        else:
            ans = (ans + odd) % MOD
            even += 1
    return ans
function numOfSubarrays(arr) {
  const MOD = 1000000007n;
  let even = 1n, odd = 0n;
  let s = 0, ans = 0n;
  for (const x of arr) {
    s += x;
    if (s % 2 === 1) { ans = (ans + even) % MOD; odd++; }
    else { ans = (ans + odd) % MOD; even++; }
  }
  return Number(ans);
}
class Solution {
    public int numOfSubarrays(int[] arr) {
        long MOD = 1_000_000_007L;
        long even = 1, odd = 0, s = 0, ans = 0;
        for (int x : arr) {
            s += x;
            if (s % 2 == 1) { ans = (ans + even) % MOD; odd++; }
            else { ans = (ans + odd) % MOD; even++; }
        }
        return (int) ans;
    }
}
int numOfSubarrays(vector<int>& arr) {
    const long MOD = 1000000007;
    long even = 1, odd = 0, s = 0, ans = 0;
    for (int x : arr) {
        s += x;
        if (s % 2 == 1) { ans = (ans + even) % MOD; odd++; }
        else { ans = (ans + odd) % MOD; even++; }
    }
    return (int) ans;
}
Time: O(n) Space: O(1)