From 5564e3b57aee8f0b58f3afc7f2a04fcddfec7714 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 27 Nov 2023 09:11:35 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.0907 No.0907.Sum of Subarray Minimums --- .../0907.Sum of Subarray Minimums/README.md | 215 ++++++++++++------ .../README_EN.md | 215 ++++++++++++------ .../Solution.cpp | 62 ++--- .../0907.Sum of Subarray Minimums/Solution.go | 7 +- .../Solution.java | 70 +++--- .../0907.Sum of Subarray Minimums/Solution.rs | 49 ++-- .../0907.Sum of Subarray Minimums/Solution.ts | 40 +++- 7 files changed, 401 insertions(+), 257 deletions(-) diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/README.md b/solution/0900-0999/0907.Sum of Subarray Minimums/README.md index 8010374edabd2..2b76c6613e867 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/README.md +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/README.md @@ -73,7 +73,7 @@ 注意数据的溢出以及取模操作。 -时间复杂度 $O(n)$,其中 $n$ 表示数组 $arr$ 的长度。 +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $arr$ 的长度。 @@ -138,7 +138,7 @@ class Solution { } stk.push(i); } - int mod = (int) 1e9 + 7; + final int mod = (int) 1e9 + 7; long ans = 0; for (int i = 0; i < n; ++i) { ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod; @@ -152,9 +152,6 @@ class Solution { ### **C++** ```cpp -using ll = long long; -const int mod = 1e9 + 7; - class Solution { public: int sumSubarrayMins(vector& arr) { @@ -163,19 +160,28 @@ public: vector right(n, n); stack stk; for (int i = 0; i < n; ++i) { - while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); + while (!stk.empty() && arr[stk.top()] >= arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } stk.push(i); } stk = stack(); for (int i = n - 1; i >= 0; --i) { - while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); + while (!stk.empty() && arr[stk.top()] > arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } stk.push(i); } - ll ans = 0; + long long ans = 0; + const int mod = 1e9 + 7; for (int i = 0; i < n; ++i) { - ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod; + ans += 1LL * (i - left[i]) * (right[i] - i) * arr[i] % mod; ans %= mod; } return ans; @@ -183,8 +189,131 @@ public: }; ``` +### **Go** + +```go +func sumSubarrayMins(arr []int) (ans int) { + n := len(arr) + left := make([]int, n) + right := make([]int, n) + for i := range left { + left[i] = -1 + right[i] = n + } + stk := []int{} + for i, v := range arr { + for len(stk) > 0 && arr[stk[len(stk)-1]] >= v { + stk = stk[:len(stk)-1] + } + if len(stk) > 0 { + left[i] = stk[len(stk)-1] + } + stk = append(stk, i) + } + stk = []int{} + for i := n - 1; i >= 0; i-- { + for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] { + stk = stk[:len(stk)-1] + } + if len(stk) > 0 { + right[i] = stk[len(stk)-1] + } + stk = append(stk, i) + } + const mod int = 1e9 + 7 + for i, v := range arr { + ans += (i - left[i]) * (right[i] - i) * v % mod + ans %= mod + } + return +} +``` + +### **TypeScript** + +```ts +function sumSubarrayMins(arr: number[]): number { + const n: number = arr.length; + const left: number[] = Array(n).fill(-1); + const right: number[] = Array(n).fill(n); + const stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length > 0 && arr[stk.at(-1)] >= arr[i]) { + stk.pop(); + } + if (stk.length > 0) { + left[i] = stk.at(-1); + } + stk.push(i); + } + + stk.length = 0; + for (let i = n - 1; ~i; --i) { + while (stk.length > 0 && arr[stk.at(-1)] > arr[i]) { + stk.pop(); + } + if (stk.length > 0) { + right[i] = stk.at(-1); + } + stk.push(i); + } + + const mod: number = 1e9 + 7; + let ans: number = 0; + for (let i = 0; i < n; ++i) { + ans += ((((i - left[i]) * (right[i] - i)) % mod) * arr[i]) % mod; + ans %= mod; + } + return ans; +} +``` + ### **Rust** +```rust +use std::collections::VecDeque; + +impl Solution { + pub fn sum_subarray_mins(arr: Vec) -> i32 { + let n = arr.len(); + let mut left = vec![-1; n]; + let mut right = vec![n as i32; n]; + let mut stk: VecDeque = VecDeque::new(); + + for i in 0..n { + while !stk.is_empty() && arr[*stk.back().unwrap()] >= arr[i] { + stk.pop_back(); + } + if let Some(&top) = stk.back() { + left[i] = top as i32; + } + stk.push_back(i); + } + + stk.clear(); + for i in (0..n).rev() { + while !stk.is_empty() && arr[*stk.back().unwrap()] > arr[i] { + stk.pop_back(); + } + if let Some(&top) = stk.back() { + right[i] = top as i32; + } + stk.push_back(i); + } + + let MOD = 1_000_000_007; + let mut ans: i64 = 0; + for i in 0..n { + ans += + ((((right[i] - (i as i32)) * ((i as i32) - left[i])) as i64) * (arr[i] as i64)) % + MOD; + ans %= MOD; + } + ans as i32 + } +} +``` + ```rust const MOD: i64 = (1e9 as i64) + 7; @@ -236,70 +365,6 @@ impl Solution { } ``` -### **Go** - -```go -func sumSubarrayMins(arr []int) int { - mod := int(1e9) + 7 - n := len(arr) - left := make([]int, n) - right := make([]int, n) - for i := range left { - left[i] = -1 - right[i] = n - } - stk := []int{} - for i, v := range arr { - for len(stk) > 0 && arr[stk[len(stk)-1]] >= v { - stk = stk[:len(stk)-1] - } - if len(stk) > 0 { - left[i] = stk[len(stk)-1] - } - stk = append(stk, i) - } - stk = []int{} - for i := n - 1; i >= 0; i-- { - for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] { - stk = stk[:len(stk)-1] - } - if len(stk) > 0 { - right[i] = stk[len(stk)-1] - } - stk = append(stk, i) - } - ans := 0 - for i, v := range arr { - ans += (i - left[i]) * (right[i] - i) * v % mod - ans %= mod - } - return ans -} -``` - -### **TypeScript** - -```ts -function sumSubarrayMins(arr: number[]): number { - const n = arr.length; - function getEle(i: number): number { - if (i == -1 || i == n) return Number.MIN_SAFE_INTEGER; - return arr[i]; - } - let ans = 0; - const mod = 10 ** 9 + 7; - let stack = []; - for (let i = -1; i <= n; i++) { - while (stack.length && getEle(stack[0]) > getEle(i)) { - const idx = stack.shift(); - ans = (ans + arr[idx] * (idx - stack[0]) * (i - idx)) % mod; - } - stack.unshift(i); - } - return ans; -} -``` - ### **...** ``` diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/README_EN.md b/solution/0900-0999/0907.Sum of Subarray Minimums/README_EN.md index 12deebfce4271..b085c03437199 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/README_EN.md +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/README_EN.md @@ -77,7 +77,7 @@ Then the number of subarrays where $arr[i]$ is the minimum can be calculated by Remember to take care of data overflow and modulus operation. -The time complexity is $O(n)$, where $n$ represents the length of the array $arr$. +The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of the array $arr$. @@ -138,7 +138,7 @@ class Solution { } stk.push(i); } - int mod = (int) 1e9 + 7; + final int mod = (int) 1e9 + 7; long ans = 0; for (int i = 0; i < n; ++i) { ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod; @@ -152,9 +152,6 @@ class Solution { ### **C++** ```cpp -using ll = long long; -const int mod = 1e9 + 7; - class Solution { public: int sumSubarrayMins(vector& arr) { @@ -163,19 +160,28 @@ public: vector right(n, n); stack stk; for (int i = 0; i < n; ++i) { - while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); + while (!stk.empty() && arr[stk.top()] >= arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } stk.push(i); } stk = stack(); for (int i = n - 1; i >= 0; --i) { - while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); + while (!stk.empty() && arr[stk.top()] > arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } stk.push(i); } - ll ans = 0; + long long ans = 0; + const int mod = 1e9 + 7; for (int i = 0; i < n; ++i) { - ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod; + ans += 1LL * (i - left[i]) * (right[i] - i) * arr[i] % mod; ans %= mod; } return ans; @@ -183,8 +189,131 @@ public: }; ``` +### **Go** + +```go +func sumSubarrayMins(arr []int) (ans int) { + n := len(arr) + left := make([]int, n) + right := make([]int, n) + for i := range left { + left[i] = -1 + right[i] = n + } + stk := []int{} + for i, v := range arr { + for len(stk) > 0 && arr[stk[len(stk)-1]] >= v { + stk = stk[:len(stk)-1] + } + if len(stk) > 0 { + left[i] = stk[len(stk)-1] + } + stk = append(stk, i) + } + stk = []int{} + for i := n - 1; i >= 0; i-- { + for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] { + stk = stk[:len(stk)-1] + } + if len(stk) > 0 { + right[i] = stk[len(stk)-1] + } + stk = append(stk, i) + } + const mod int = 1e9 + 7 + for i, v := range arr { + ans += (i - left[i]) * (right[i] - i) * v % mod + ans %= mod + } + return +} +``` + +### **TypeScript** + +```ts +function sumSubarrayMins(arr: number[]): number { + const n: number = arr.length; + const left: number[] = Array(n).fill(-1); + const right: number[] = Array(n).fill(n); + const stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length > 0 && arr[stk.at(-1)] >= arr[i]) { + stk.pop(); + } + if (stk.length > 0) { + left[i] = stk.at(-1); + } + stk.push(i); + } + + stk.length = 0; + for (let i = n - 1; ~i; --i) { + while (stk.length > 0 && arr[stk.at(-1)] > arr[i]) { + stk.pop(); + } + if (stk.length > 0) { + right[i] = stk.at(-1); + } + stk.push(i); + } + + const mod: number = 1e9 + 7; + let ans: number = 0; + for (let i = 0; i < n; ++i) { + ans += ((((i - left[i]) * (right[i] - i)) % mod) * arr[i]) % mod; + ans %= mod; + } + return ans; +} +``` + ### **Rust** +```rust +use std::collections::VecDeque; + +impl Solution { + pub fn sum_subarray_mins(arr: Vec) -> i32 { + let n = arr.len(); + let mut left = vec![-1; n]; + let mut right = vec![n as i32; n]; + let mut stk: VecDeque = VecDeque::new(); + + for i in 0..n { + while !stk.is_empty() && arr[*stk.back().unwrap()] >= arr[i] { + stk.pop_back(); + } + if let Some(&top) = stk.back() { + left[i] = top as i32; + } + stk.push_back(i); + } + + stk.clear(); + for i in (0..n).rev() { + while !stk.is_empty() && arr[*stk.back().unwrap()] > arr[i] { + stk.pop_back(); + } + if let Some(&top) = stk.back() { + right[i] = top as i32; + } + stk.push_back(i); + } + + let MOD = 1_000_000_007; + let mut ans: i64 = 0; + for i in 0..n { + ans += + ((((right[i] - (i as i32)) * ((i as i32) - left[i])) as i64) * (arr[i] as i64)) % + MOD; + ans %= MOD; + } + ans as i32 + } +} +``` + ```rust const MOD: i64 = (1e9 as i64) + 7; @@ -236,70 +365,6 @@ impl Solution { } ``` -### **Go** - -```go -func sumSubarrayMins(arr []int) int { - mod := int(1e9) + 7 - n := len(arr) - left := make([]int, n) - right := make([]int, n) - for i := range left { - left[i] = -1 - right[i] = n - } - stk := []int{} - for i, v := range arr { - for len(stk) > 0 && arr[stk[len(stk)-1]] >= v { - stk = stk[:len(stk)-1] - } - if len(stk) > 0 { - left[i] = stk[len(stk)-1] - } - stk = append(stk, i) - } - stk = []int{} - for i := n - 1; i >= 0; i-- { - for len(stk) > 0 && arr[stk[len(stk)-1]] > arr[i] { - stk = stk[:len(stk)-1] - } - if len(stk) > 0 { - right[i] = stk[len(stk)-1] - } - stk = append(stk, i) - } - ans := 0 - for i, v := range arr { - ans += (i - left[i]) * (right[i] - i) * v % mod - ans %= mod - } - return ans -} -``` - -### **TypeScript** - -```ts -function sumSubarrayMins(arr: number[]): number { - const n = arr.length; - function getEle(i: number): number { - if (i == -1 || i == n) return Number.MIN_SAFE_INTEGER; - return arr[i]; - } - let ans = 0; - const mod = 10 ** 9 + 7; - let stack = []; - for (let i = -1; i <= n; i++) { - while (stack.length && getEle(stack[0]) > getEle(i)) { - const idx = stack.shift(); - ans = (ans + arr[idx] * (idx - stack[0]) * (i - idx)) % mod; - } - stack.unshift(i); - } - return ans; -} -``` - ### **...** ``` diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.cpp b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.cpp index b5a0bdae10f24..674fb59ea90d5 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.cpp +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.cpp @@ -1,29 +1,35 @@ -using ll = long long; -const int mod = 1e9 + 7; - -class Solution { -public: - int sumSubarrayMins(vector& arr) { - int n = arr.size(); - vector left(n, -1); - vector right(n, n); - stack stk; - for (int i = 0; i < n; ++i) { - while (!stk.empty() && arr[stk.top()] >= arr[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); - stk.push(i); - } - stk = stack(); - for (int i = n - 1; i >= 0; --i) { - while (!stk.empty() && arr[stk.top()] > arr[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); - stk.push(i); - } - ll ans = 0; - for (int i = 0; i < n; ++i) { - ans += (ll) (i - left[i]) * (right[i] - i) * arr[i] % mod; - ans %= mod; - } - return ans; - } +class Solution { +public: + int sumSubarrayMins(vector& arr) { + int n = arr.size(); + vector left(n, -1); + vector right(n, n); + stack stk; + for (int i = 0; i < n; ++i) { + while (!stk.empty() && arr[stk.top()] >= arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } + stk.push(i); + } + stk = stack(); + for (int i = n - 1; i >= 0; --i) { + while (!stk.empty() && arr[stk.top()] > arr[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } + stk.push(i); + } + long long ans = 0; + const int mod = 1e9 + 7; + for (int i = 0; i < n; ++i) { + ans += 1LL * (i - left[i]) * (right[i] - i) * arr[i] % mod; + ans %= mod; + } + return ans; + } }; \ No newline at end of file diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.go b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.go index 473d524b7611e..0bcaf4b615249 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.go +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.go @@ -1,5 +1,4 @@ -func sumSubarrayMins(arr []int) int { - mod := int(1e9) + 7 +func sumSubarrayMins(arr []int) (ans int) { n := len(arr) left := make([]int, n) right := make([]int, n) @@ -27,10 +26,10 @@ func sumSubarrayMins(arr []int) int { } stk = append(stk, i) } - ans := 0 + const mod int = 1e9 + 7 for i, v := range arr { ans += (i - left[i]) * (right[i] - i) * v % mod ans %= mod } - return ans + return } \ No newline at end of file diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.java b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.java index 006aba0a5ef09..853a5f116185c 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.java +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.java @@ -1,36 +1,36 @@ -class Solution { - public int sumSubarrayMins(int[] arr) { - int n = arr.length; - int[] left = new int[n]; - int[] right = new int[n]; - Arrays.fill(left, -1); - Arrays.fill(right, n); - Deque stk = new ArrayDeque<>(); - for (int i = 0; i < n; ++i) { - while (!stk.isEmpty() && arr[stk.peek()] >= arr[i]) { - stk.pop(); - } - if (!stk.isEmpty()) { - left[i] = stk.peek(); - } - stk.push(i); - } - stk.clear(); - for (int i = n - 1; i >= 0; --i) { - while (!stk.isEmpty() && arr[stk.peek()] > arr[i]) { - stk.pop(); - } - if (!stk.isEmpty()) { - right[i] = stk.peek(); - } - stk.push(i); - } - int mod = (int) 1e9 + 7; - long ans = 0; - for (int i = 0; i < n; ++i) { - ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod; - ans %= mod; - } - return (int) ans; - } +class Solution { + public int sumSubarrayMins(int[] arr) { + int n = arr.length; + int[] left = new int[n]; + int[] right = new int[n]; + Arrays.fill(left, -1); + Arrays.fill(right, n); + Deque stk = new ArrayDeque<>(); + for (int i = 0; i < n; ++i) { + while (!stk.isEmpty() && arr[stk.peek()] >= arr[i]) { + stk.pop(); + } + if (!stk.isEmpty()) { + left[i] = stk.peek(); + } + stk.push(i); + } + stk.clear(); + for (int i = n - 1; i >= 0; --i) { + while (!stk.isEmpty() && arr[stk.peek()] > arr[i]) { + stk.pop(); + } + if (!stk.isEmpty()) { + right[i] = stk.peek(); + } + stk.push(i); + } + final int mod = (int) 1e9 + 7; + long ans = 0; + for (int i = 0; i < n; ++i) { + ans += (long) (i - left[i]) * (right[i] - i) % mod * arr[i] % mod; + ans %= mod; + } + return (int) ans; + } } \ No newline at end of file diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.rs b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.rs index 88a984f333273..641a53ffa34f3 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.rs +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.rs @@ -1,48 +1,41 @@ -const MOD: i64 = (1e9 as i64) + 7; +use std::collections::VecDeque; impl Solution { pub fn sum_subarray_mins(arr: Vec) -> i32 { - let n: usize = arr.len(); - let mut ret: i64 = 0; - let mut left: Vec = vec![-1; n]; - let mut right: Vec = vec![n as i32; n]; - // Index stack, store the index of the value in the given array - let mut stack: Vec = Vec::new(); + let n = arr.len(); + let mut left = vec![-1; n]; + let mut right = vec![n as i32; n]; + let mut stk: VecDeque = VecDeque::new(); - // Find the first element that's less than the current value for the left side - // The default value of which is -1 for i in 0..n { - while !stack.is_empty() && arr[*stack.last().unwrap() as usize] >= arr[i] { - stack.pop(); + while !stk.is_empty() && arr[*stk.back().unwrap()] >= arr[i] { + stk.pop_back(); } - if !stack.is_empty() { - left[i] = *stack.last().unwrap(); + if let Some(&top) = stk.back() { + left[i] = top as i32; } - stack.push(i as i32); + stk.push_back(i); } - stack.clear(); - - // Find the first element that's less or equal than the current value for the right side - // The default value of which is n + stk.clear(); for i in (0..n).rev() { - while !stack.is_empty() && arr[*stack.last().unwrap() as usize] > arr[i] { - stack.pop(); + while !stk.is_empty() && arr[*stk.back().unwrap()] > arr[i] { + stk.pop_back(); } - if !stack.is_empty() { - right[i] = *stack.last().unwrap(); + if let Some(&top) = stk.back() { + right[i] = top as i32; } - stack.push(i as i32); + stk.push_back(i); } - // Traverse the array, to find the sum + let MOD = 1_000_000_007; + let mut ans: i64 = 0; for i in 0..n { - ret += + ans += ((((right[i] - (i as i32)) * ((i as i32) - left[i])) as i64) * (arr[i] as i64)) % MOD; - ret %= MOD; + ans %= MOD; } - - (ret % (MOD as i64)) as i32 + ans as i32 } } diff --git a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.ts b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.ts index a024ebd92fd9e..733e10ad759a0 100644 --- a/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.ts +++ b/solution/0900-0999/0907.Sum of Subarray Minimums/Solution.ts @@ -1,18 +1,34 @@ function sumSubarrayMins(arr: number[]): number { - const n = arr.length; - function getEle(i: number): number { - if (i == -1 || i == n) return Number.MIN_SAFE_INTEGER; - return arr[i]; + const n: number = arr.length; + const left: number[] = Array(n).fill(-1); + const right: number[] = Array(n).fill(n); + const stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length > 0 && arr[stk.at(-1)] >= arr[i]) { + stk.pop(); + } + if (stk.length > 0) { + left[i] = stk.at(-1); + } + stk.push(i); } - let ans = 0; - const mod = 10 ** 9 + 7; - let stack = []; - for (let i = -1; i <= n; i++) { - while (stack.length && getEle(stack[0]) > getEle(i)) { - const idx = stack.shift(); - ans = (ans + arr[idx] * (idx - stack[0]) * (i - idx)) % mod; + + stk.length = 0; + for (let i = n - 1; ~i; --i) { + while (stk.length > 0 && arr[stk.at(-1)] > arr[i]) { + stk.pop(); } - stack.unshift(i); + if (stk.length > 0) { + right[i] = stk.at(-1); + } + stk.push(i); + } + + const mod: number = 1e9 + 7; + let ans: number = 0; + for (let i = 0; i < n; ++i) { + ans += ((((i - left[i]) * (right[i] - i)) % mod) * arr[i]) % mod; + ans %= mod; } return ans; }